Проблемы BorderFactory и Metal L & F - PullRequest
0 голосов
/ 12 октября 2018

Я вижу странное поведение.Набор L & F - Металл.

UIManager.setLookAndFeel ("javax.swing.plaf.metal.MetalLookAndFeel");

Если я установлю границу Границы1 на JPanelЗатем я изменяю Границу на border2 на том же JPanel, когда всплывающая подсказка переходит на border2, перерисовываю перерисовку border1.Это происходит только на L & F Metal, с LineBorder, TitledBorder ....

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

происходит только в Metal L & F.

У вас все еще есть проблема, даже если вы специально не устанавливаете LAF.

Если я установлюBorder border1 на JPanel, затем я изменяю Border на border2 на том же JPanel, когда всплывающая подсказка переходит на border2, перерисовывает перерисовку border1

Это не имеет никакого отношения к всплывающей подсказке.

Просто нажмите на пару квадратов, а затем измените размер рамки, и все границы будут перекрашены синим цветом.

Проблема в вашем ColorsBoard классе.

Вы НЕ должны переопределятьpaintComponent() метод для создания компонентов.

Метод рисования используется только для рисования.

Метод paintComponent () вызывается всякий раз, когда Swing определяет, что компонент необходимо перекрасить.Вот почему изменение размера кадра также вызывает проблему.Вы воссоздаете все компоненты.

Решение:

  1. Не переопределяйте метод paintComponent ()!
  2. Создайте все компоненты в конструкторе вашегокласс
  3. Не используйте пустой макет.Вместо этого используйте GridLayout на панели и просто добавьте свои квадраты в сетку.
  4. используйте setBackground(Color.LIGHT_GRAY) в конструкторе для установки фона

Также:

  1. избавьтесь от всех ключевых слов synchronized в ваших методах.Они не нужны.
  2. Не используйте "==" для сравнения объектов.Используйте метод equals(...).
0 голосов
/ 14 октября 2018
public class BorderTest {

private JFrame jFrame;
private Container contentPane;
private ColorsBoard colorsBoard;

public BorderTest() {
    super();

    ToolTipManager.sharedInstance().setInitialDelay(10);
    ToolTipManager.sharedInstance().setDismissDelay(1500);
    jFrame = new JFrame();

    contentPane = jFrame.getContentPane();
    contentPane.setLayout(new BorderLayout());

    jFrame.setPreferredSize(new Dimension(700, 500));
    colorsBoard = new ColorsBoard();
    contentPane.add(colorsBoard, BorderLayout.CENTER);

    JLabel label = new JLabel(""
            + "<html>Click two or three small squares. <br/>"
            + "LineBorder's are set. <br/>"
            + "Then pass the tooltips over the red borders. <br/>"
            + "The red LineBorders' are back to blue. <br/>"
            + "This phenomen appears only in Metal L&F. </html>");
    contentPane.add(label, BorderLayout.EAST);

    jFrame.pack();
    jFrame.setVisible(true);
}

public static void main(String[] args) {
     try {
            UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");

        new BorderTest();
    } catch (Exception e) {
            e.printStackTrace();
    }
}
}

class ColorsBoard extends JPanel {

private int squareSize = 315;
private int horizontal = 8;    //number of squares H
private int vertical = 8;      //number of squares V

private SquaredPanel[] squarePanels;   
int index = 0;
public int lastClickedSquare = -1;

// the chess board like JPanel.

public ColorsBoard() {
    squarePanels= new SquaredPanel[horizontal * vertical];
    this.setPreferredSize(new Dimension(squareSize, squareSize));
    setLayout(null);
}

// fill with squares (SquaredPanel)

protected synchronized void paintComponent(Graphics g) {
    super.paintComponent(g);

    int tileSizeH = squareSize / horizontal;
    int tileSizeV = squareSize / vertical;

    g.setColor(Color.LIGHT_GRAY);
    g.fillRect(0, 0, getWidth(), getHeight());

    for(int i = 0; i < horizontal*vertical; i++) {
        squarePanels[i] = new SquaredPanel(this);
    }

    index = 0;
    for (int i = 0; i < horizontal; i++) {
        for (int j = 0; j < vertical; j++) {
                if(index == horizontal * vertical) break;
                    squarePanels[index].setBackground(Color.gray);
                    squarePanels[index].setSize(tileSizeH - 1, tileSizeV - 1);
                    squarePanels[index].setLocation(i * tileSizeH, j * tileSizeV);
                    squarePanels[index].setName("index " + index);
                    squarePanels[index].setIndex(index);
                    add(squarePanels[index]);
                    index++;
            }
        }
    }

public void eraseLastBlueBorder(int lastClickedSquare2) {
    if (lastClickedSquare == -1) {
        lastClickedSquare = lastClickedSquare2;
        return;
    }
    if(!squarePanels[lastClickedSquare].isRed)(squarePanels[lastClickedSquare]).cleanBorder();
    lastClickedSquare = lastClickedSquare2;
}
}

class SquaredPanel extends JPanel {

private String name;
protected Boolean isRed = false;
private int index;
private Border theBorder =  (new LineBorder(Color.gray, 2));

protected Border getTheBorder() {
    return theBorder;
}

public SquaredPanel(ColorsBoard colorsBoard) {
    super();

    addMouseListener(new MouseListener(){
        public void mouseClicked(MouseEvent e) {
        }
        public void mousePressed(MouseEvent e) {
        }
        public void mouseReleased(MouseEvent e) {
            colorsBoard.eraseLastBlueBorder(index);
            setTitleBorder("RED");
        }
        public void mouseEntered(MouseEvent e) {
            setToolTipText(name);
        }
        public void mouseExited(MouseEvent e) {
            setToolTipText(null);
        }
      });
}

// the setBorder call
    protected void setTitleBorder(String title) {
        theBorder = (new LineBorder(title == "BLUE" ? Color.red : Color.blue, 2));
        setBorder(theBorder);
    }


public synchronized void cleanBorder() {
    setTitleBorder("BLUE");
}

public void setName(String name) {
    this.name = name;
}

public void setIndex(int k) {
    index = k;
}
}
...