Когда я использую firePropertyChange для обновления моего JList, моя jtabbedpane больше не обновляется - PullRequest
0 голосов
/ 04 июня 2019

Я создал JTable с заголовком строки (заголовок, который находится на левой стороне).Это также может изменить размер.Для обновления размера заголовков строк я использую list.firePropertyChange("cellRenderer", 0, 1);.Моя проблема в том, что когда я использую этот код, мой JTabbedPane обновляется только при изменении размера JFrame, но если я не использую этот код, поэтому JTabbedPane обновляется автоматически, заголовок строки больше не обновляется.Как я могу это исправить?

Пример кода:

public class Frame extends JFrame {
    public static final String DIR = System.getProperty("user.dir");
    private JTabbedPane menu;
    private Panel menuSide0, menuSide1, menuSide2, menuSide3; //menu panels
    private JPanel mainPanel; //main Panel where content is on
    private JPanel menuPanel; //menu Panel where the Menu and selection is on
    private JPanel selectionPanel; //The Panel where you will get the information about which parts u have selected
    private JPanel optionPanel; //The Panel where you scroll and you can change between diffrent files
    private ImageButton saveB, save_asB, openB;

    public Frame() {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            e.printStackTrace();
        }

        /*Frame Options*/
        this.setExtendedState(JFrame.MAXIMIZED_BOTH); 
        this.setMinimumSize(new Dimension(500, 400));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(null);
        this.setBackground(Color.WHITE);

        /*Menu*/
        menuPanel = new JPanel();
        this.add(menuPanel, BorderLayout.NORTH);
        menuPanel.setLayout(new BorderLayout());
        menuPanel.setPreferredSize(new Dimension(this.getWidth(), 200));

        UIManager.put("TabbedPane.selected", Color.WHITE);
        UIManager.put("TabbedPane.focus", Color.WHITE);
        menu = new JTabbedPane(JTabbedPane.TOP);
        menu.setSize(this.getWidth(), 100);
        menu.setPreferredSize(new Dimension(this.getWidth(), 130));
        menu.setBackground(Color.white);
        menuPanel.add(menu, BorderLayout.NORTH);

        /*Menusides*/
        JPanel spaceTop = new JPanel();
        spaceTop.setSize(Toolkit.getDefaultToolkit().getScreenSize().width, 20);
        spaceTop.setBackground(new Color(255, 255, 255));
        menuSide0 = new Panel(new BorderLayout());
        menuSide0.add(spaceTop, BorderLayout.NORTH);
        menuSide1 = new Panel();
        menuSide2 = new Panel();

        menu.add("menuside0", menuSide0);
        menu.add("menuside1", menuSide1);
        menu.add("menuside2", menuSide2);

        //menuside0
        JPanel panel0 = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panel0.setBackground(Color.WHITE);
        panel0.add(new JButton("ARGH"));
        panel0.add(new JButton("ARGH"));
        panel0.add(new JButton("ARGH"));
        menuSide0.add(panel0);

        JTable table = new JTable(10, 10);
        RowHeaderRenderer rhr = new RowHeaderRenderer(table);


        JScrollPane scroll = new JScrollPane(table);
        scroll.setRowHeaderView(buildRowHeader(table));
        this.add(scroll);
        this.add(menu, BorderLayout.NORTH);
        this.setVisible(true);
    }

    private static final long serialVersionUID = 1L;
    private JTable table;
    public static final Dimension SCREEN_SIZE = Toolkit.getDefaultToolkit().getScreenSize();
    public static final int MIN_ROW_HEIGHT = (int)SCREEN_SIZE.getHeight()/36;
    public static final int MIN_ROW_WIDTH = (int)SCREEN_SIZE.getWidth()/108;

    static class RowHeaderRenderer extends JLabel implements ListCellRenderer<Object> {
        /**
         * 
         */

        private static final long serialVersionUID = 1L;
        private JTable table;

        RowHeaderRenderer(JTable table) {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {}
            this.table = table;
            JTableHeader header = this.table.getTableHeader();
            setOpaque(true);
            setBorder(new MatteBorder(1, 1, 0, 1, Color.LIGHT_GRAY));
            setHorizontalAlignment(CENTER);
            setForeground(null);
            setBackground(Color.WHITE);
            setFont(header.getFont());
            setDoubleBuffered(true);
        }

        public Component getListCellRendererComponent(JList<?> list, Object value,
                                                      int index, boolean isSelected, boolean cellHasFocus) {
            setText((value == null) ? "" : value.toString());
            setPreferredSize(new Dimension((int) getPreferredSize().getWidth(), table.getRowHeight(index)));
            list.firePropertyChange("cellRenderer", 0, 1);
            return this;
        }
    }

    private static JList<Object> buildRowHeader(JTable table) {
        final Vector<String> headers = new Vector<String>();
        for (int i = 0; i < table.getRowCount(); i++) {
            String name = "";
            if (i < 10) {
                name += "0";
            }
            if (i < 100) {
                name += "0";
            }
            name += i;
            headers.add(name);
        }
        ListModel<Object> lm = new AbstractListModel<Object>() {

            /**
             * 
             */
            private static final long serialVersionUID = 1L;

            public int getSize() {
                return headers.size();
            }

            public Object getElementAt(int index) {
                return headers.get(index);
            }
        };

        final JList<Object> rowHeader = new JList<>(lm);
        rowHeader.setOpaque(false);
        rowHeader.setFixedCellWidth(MIN_ROW_HEIGHT);


        MouseInputAdapter mouseAdapter = new MouseInputAdapter() {
            Cursor oldCursor;
            Cursor RESIZE_CURSOR = Cursor.getPredefinedCursor(Cursor.S_RESIZE_CURSOR);
            int index = -1;
            int oldY = -1;

            @Override
            public void mouseMoved(MouseEvent e) {
                super.mouseMoved(e);
                int previ = getLocationToIndex(new Point(e.getX(), e.getY() - 3));
                int nexti = getLocationToIndex(new Point(e.getX(), e.getY() + 3));
                if (previ != -1 && previ != nexti) {
                    if (!isResizeCursor()) {
                        oldCursor = rowHeader.getCursor();
                        rowHeader.setCursor(RESIZE_CURSOR);
                        index = previ;
                    }
                } else if (isResizeCursor()) {
                    rowHeader.setCursor(oldCursor);
                }
            }

            private int getLocationToIndex(Point point) {
                int i = rowHeader.locationToIndex(point);
                if (!rowHeader.getCellBounds(i, i).contains(point)) {
                    i = -1;
                }
                return i;
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                super.mouseReleased(e);
                if (isResizeCursor()) {
                    rowHeader.setCursor(oldCursor);
                    index = -1;
                    oldY = -1;
                }
            }

            @Override
            public void mouseDragged(MouseEvent e) {
                super.mouseDragged(e);
                if (isResizeCursor() && index != -1) {
                    int y = e.getY();
                    if (oldY != -1) {
                        int inc = y - oldY;
                        int oldRowHeight = table.getRowHeight(index);
                        int oldNextRowHeight = table.getRowHeight(index+1);
                        if (oldRowHeight > MIN_ROW_HEIGHT || inc > 0) {
                            int rowHeight = Math.max(MIN_ROW_HEIGHT, oldRowHeight + inc);
                            table.setRowHeight(index, rowHeight);
                            if (rowHeader.getModel().getSize() > index + 1) {
                                int rowHeight1 = table.getRowHeight(index + 1) - inc;
                                rowHeight1 = Math.max(MIN_ROW_HEIGHT, rowHeight1);
                                table.setRowHeight(index + 1, rowHeight1);
                            }
                        }
                        if (table.getRowCount()>index+1)
                            table.setRowHeight(1+index, oldNextRowHeight);
                    }
                    oldY = y;
                }
            }

            private boolean isResizeCursor() {
                return rowHeader.getCursor() == RESIZE_CURSOR;
            }
        };
        rowHeader.addMouseListener(mouseAdapter);
        rowHeader.addMouseMotionListener(mouseAdapter);
        rowHeader.addMouseWheelListener(mouseAdapter);

        rowHeader.setCellRenderer(new RowHeaderRenderer(table));
        rowHeader.setBackground(table.getBackground());
        rowHeader.setForeground(table.getForeground());
        return rowHeader;
    }

    public static void main(String[] args) {
        Frame frame = new Frame();
    }

}

Редактировать: Как я выяснил, эта ошибка не появляется, когда ядобавьте panel0 непосредственно к JTabbedPane вместо того, чтобы добавить его к menuSide0, но тогда я отформатирую его так хорошо.Должен ли я просто использовать другой макет или исправить его как-нибудь еще?

...