Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 边界工厂和金属L&;F问题_Java_Swing_Border - Fatal编程技术网

Java 边界工厂和金属L&;F问题

Java 边界工厂和金属L&;F问题,java,swing,border,Java,Swing,Border,我看到一种奇怪的行为。L&F套装是金属的 setLookAndFeel(“javax.swing.plaf.metal.MetalLookAndFeel”) 如果在JPanel上设置边框border1,则在同一JPanel上将边框更改为border2,当工具提示经过border2时,重新绘制border1。这仅发生在L&F金属上,带有LineBorder、TitleBorder…公共类BorderTest{ public class BorderTest { private JFrame jF

我看到一种奇怪的行为。L&F套装是金属的

setLookAndFeel(“javax.swing.plaf.metal.MetalLookAndFeel”)

如果在JPanel上设置边框border1,则在同一JPanel上将边框更改为border2,当工具提示经过border2时,重新绘制border1。这仅发生在L&F金属上,带有LineBorder、TitleBorder…

公共类BorderTest{
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;
}
}
私有JFrame-JFrame; 专用容器内容窗格; 私人色板色板; 公共边界测试(){ 超级(); ToolTimManager.sharedInstance().setInitialDelay(10); ToolTimManager.sharedInstance().setDismissDelay(1500); jFrame=新的jFrame(); contentPane=jFrame.getContentPane(); setLayout(新的BorderLayout()); jFrame.setPreferredSize(新尺寸(700500)); 色板=新色板(); 添加(颜色板、边框布局、中间); JLabel标签=新的JLabel(“”) +“单击两个或三个小正方形。
” +“已设置线条边框。
” +“然后将工具提示传递到红色边框上。
” +“红色线条边框”恢复为蓝色。
” +“这种现象只出现在金属L&F中。”; 添加(标签,BorderLayout.EAST); jFrame.pack(); jFrame.setVisible(true); } 公共静态void main(字符串[]args){ 试一试{ setLookAndFeel(“javax.swing.plaf.metal.MetalLookAndFeel”); 新边界测试(); }捕获(例外e){ e、 printStackTrace(); } } } 类ColorsBoard扩展了JPanel{ 私人int squareSize=315; private int horizontal=8;//平方数H private int vertical=8;//平方数V 私人方形面板[]方形面板; int指数=0; 公共int lastClickedSquare=-1; //像杰帕内尔这样的棋盘。 公共色板(){ 方形面板=新的方形面板[水平*垂直]; 此.setPreferredSize(新尺寸(squareSize,squareSize)); setLayout(空); } //用正方形填充(正方形面板) 受保护的组件(图形g){ 超级组件(g); int tileSizeH=平方大小/水平; int tileSizeV=平方大小/垂直; g、 setColor(颜色:浅灰色); g、 fillRect(0,0,getWidth(),getHeight()); 对于(int i=0;i<水平*垂直;i++){ 方形面板[i]=新的方形面板(本); } 指数=0; 对于(int i=0;i
仅在金属L&F中发生

即使没有专门设置LAF,您仍然会遇到问题

如果在JPanel上设置边框border1,则在同一JPanel上将边框更改为border2,当工具提示传递到border2上时,重新绘制border1

它与工具提示无关

只需单击两个正方形,然后调整框架大小,所有边框都会重新涂成蓝色

问题是你的
ColorsBoard

您不应该重写
paintComponent()
方法来创建组件

绘画方法仅用于绘画。

每当Swing确定需要重新绘制组件时,就会调用paintComponent()方法。这就是为什么调整帧大小也会导致问题的原因。您正在重新创建所有组件

解决方案:

  • 不要重写paintComponent()方法
  • 在类的构造函数中创建所有组件
  • 不要使用空布局。相反,在面板上使用网格布局,只需将正方形添加到网格中即可
  • 在构造函数中使用
    setBackground(颜色.浅灰色)
    设置背景
  • 此外:

  • 去掉方法上所有的
    同步的
    关键字。不需要它们
  • 不要使用“==”来比较对象。使用
    equals(…)
    方法
  • 张贴你的演示问题。好的,我有d