gpt4 book ai didi

java - 扩展 JLabel 的类不遵循容器的布局

转载 作者:行者123 更新时间:2023-11-30 05:42:57 25 4
gpt4 key购买 nike

我正在尝试使用 WindowBuilder 在 Eclipse 中创建数独应用程序。我决定使用 JLabels 作为单元格。我有一个 Cell 类,它扩展了 JLabel 并添加了 3 个字段 - 值、x 和 y。单元格通过 GridLayout 放置在 9 个 JPanel 中。

问题是,当我将单元格添加到 JPanel 中时,它们看起来像是彼此堆叠在一起,就好像 GridLayout 不起作用一样。当我对 JLabels 执行相同操作时,它们看起来很好。

使用单元格:

enter image description here

使用 JLabel:

enter image description here

这是 Cell 类:

import javax.swing.JLabel;

public class Cell extends JLabel {


private static final long serialVersionUID = 1L;
private int value;
private int x;
private int y;

public Cell(int value, int x, int y) {
super(Integer.toString(value));
this.value = value;
this.x = x;
this.y = y;
}

public Cell(int value) {
this.value = value;
}

public int getValue() {
return value;
}

public void setValue(int value) {
this.value = value;
}

public int getX() {
return x;
}

public void setX(int x) {
this.x = x;
}

public int getY() {
return y;
}

public void setY(int y) {
this.y = y;
}

}

下面是MainFrame 类。我正在更改initialize() 方法中的两行。它与

配合得很好
JLabel cell = new JLabel(Integer.toString(j));

但不与

JLabel cell = new Cell(j, j, i);

完整的 MainFrame 类:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;


public class MainFrame {

private JFrame frame;

/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame window = new MainFrame();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}

/**
* Create the application.
*/
public MainFrame() {
initialize();
}

/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setResizable(false);
frame.setBounds(100, 100, 458, 532);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new GridLayout(1, 0, 0, 0));

JPanel mainPanel = new JPanel();
mainPanel.setForeground(Color.WHITE);
mainPanel.setBorder(new LineBorder(new Color(0, 0, 0), 2));
mainPanel.setBounds(10, 61, 422, 422);
frame.getContentPane().add(mainPanel);
mainPanel.setLayout(new GridLayout(3, 0, 0, 0));

JPanel[] bigSquares = new JPanel[9];

for (int i=0; i < 9; i++) {

bigSquares[i] = new JPanel();
mainPanel.add(bigSquares[i]);
bigSquares[i].setBorder(new LineBorder(new Color(0, 0, 0), 2));
bigSquares[i].setLayout(new GridLayout(3, 0, 0, 0));


for (int j=0; j < 9; j++) {

JLabel cell = new Cell(j, j, i);
//JLabel cell = new JLabel();

cell.setBorder(new LineBorder(new Color(0, 0, 0), 1));
cell.setVerticalAlignment(SwingConstants.CENTER);
cell.setHorizontalAlignment(SwingConstants.CENTER);
cell.setFont(new Font("Tahoma", Font.PLAIN, 14));

bigSquares[i].add(cell);
}
}


}
}

最佳答案

问题是 JLabel 已经有 getX()getY() 方法(实际上,这些方法来自 JComponent 。请参阅JavaDoc for getX()

原始方法

Returns the current x/y coordinate of the component's origin

通过覆盖 getXgetY,您实际上是在定义相对于其父容器的组件坐标。

<小时/>

一种解决方案是将您的方法重命名为 getCellXgetCellY

另一个解决方案是使用一个单独的类 Cell,它有一个值、坐标 x、y 和一个用于显示该值的 JLabel。

关于java - 扩展 JLabel 的类不遵循容器的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55349742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com