JPanel下拉菜单被截断
JPanel dropdown menu cut off
我正在通过创建文本分析程序(字数统计、TF-IDF 等)来练习 Java。
我现在正在构建一个小的 GUI 以显示在框架的顶部。我想要一个下拉菜单,我正在尝试使用 JPanel
和几个 JButton
组件创建一个。但是为了使下拉列表可重用,我一直在尝试构建一个 class 来管理它。
但是,我遇到了一个问题:当我尝试创建下拉菜单时,它只在框架的左上角可见,如果我尝试移动它,它就会被切断或完全消失。
我尝试创建一个简单的方法来做同样的事情,但问题仍然存在。这是相关代码(忽略处理器和 State
东西):
public class ExperimentState extends State {
private JFrame frame;
public ExperimentState(Processor processor) {
super(processor);
initialize();
}
private void initialize() {
int width, height;
//these variables are temporary, for testing
width = 800;
height = 640;
//Set up the frame
frame = new JFrame();
frame.setSize(width, height);
frame.getContentPane().setLayout(null);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Test code
String[] buttonNames = { "42", "Don't panic!", "Towel"};
// x, y, width, height, button names
JPanel panel = createPanel(0, 0, 100, 25, buttonNames);
frame.getContentPane().add(panel);
}
public JPanel createPanel(int x, int y, int width, int height, String[] names) {
//Create and setup the panel
JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBounds(x, y, width, height);
JButton[] buttons = new JButton[names.length];
for(int i = 0; i < names.length; i++) {
JButton button = new JButton(names[i]);
button.setBounds(x, y + height*i, width, height); //each button has the size of the panel, and are placed on top of each other
panel.add(button);
buttons[i] = button;
}
buttons[0].addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
panel.setBounds(x, y, width, height*names.length); //the panel extends to reveal all the buttons
}
public void mouseExited(MouseEvent e) {
panel.setBounds(x, y, width, height); //the panel retracts
}
});
return panel;
}
@Override
public void display() {
frame.setVisible(true);
}
@Override
public void hide() {
frame.setVisible(false);
}
}
我认为鼠标侦听器会有问题,因为我真的不知道它们是如何工作的,并且认为它们无法访问 x
、y
, width
和 height
变量随时调用,但没有问题。
当我用 createPanel(50, 0, 100, 25, buttonNames)
调用 createPanel()
时出现问题。
这里,x 是 50 而不是 0。显示时,面板向右移动,这是应该的,但它的按钮现在被一些看不见的线切成两半。如果 x = 100,它将完全不可见。
为什么会这样?我错过了什么?
容器内的组件只有在这些组件的边界完全在其中时才会完全显示(没有 LayoutManager)。通过将 x 坐标从 0 更改为 50,您可以移动按钮的位置。如果您不更改其大小或容器的大小,您的 Button 将被切断。
解决此问题的最简单方法是将按钮位置的 x 和 y 替换为 0,并将面板位置的 0 替换为 x 和 y。
编辑:此处存在类似问题:Components not showing in second JPanel
我正在通过创建文本分析程序(字数统计、TF-IDF 等)来练习 Java。
我现在正在构建一个小的 GUI 以显示在框架的顶部。我想要一个下拉菜单,我正在尝试使用 JPanel
和几个 JButton
组件创建一个。但是为了使下拉列表可重用,我一直在尝试构建一个 class 来管理它。
但是,我遇到了一个问题:当我尝试创建下拉菜单时,它只在框架的左上角可见,如果我尝试移动它,它就会被切断或完全消失。
我尝试创建一个简单的方法来做同样的事情,但问题仍然存在。这是相关代码(忽略处理器和 State
东西):
public class ExperimentState extends State {
private JFrame frame;
public ExperimentState(Processor processor) {
super(processor);
initialize();
}
private void initialize() {
int width, height;
//these variables are temporary, for testing
width = 800;
height = 640;
//Set up the frame
frame = new JFrame();
frame.setSize(width, height);
frame.getContentPane().setLayout(null);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Test code
String[] buttonNames = { "42", "Don't panic!", "Towel"};
// x, y, width, height, button names
JPanel panel = createPanel(0, 0, 100, 25, buttonNames);
frame.getContentPane().add(panel);
}
public JPanel createPanel(int x, int y, int width, int height, String[] names) {
//Create and setup the panel
JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBounds(x, y, width, height);
JButton[] buttons = new JButton[names.length];
for(int i = 0; i < names.length; i++) {
JButton button = new JButton(names[i]);
button.setBounds(x, y + height*i, width, height); //each button has the size of the panel, and are placed on top of each other
panel.add(button);
buttons[i] = button;
}
buttons[0].addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
panel.setBounds(x, y, width, height*names.length); //the panel extends to reveal all the buttons
}
public void mouseExited(MouseEvent e) {
panel.setBounds(x, y, width, height); //the panel retracts
}
});
return panel;
}
@Override
public void display() {
frame.setVisible(true);
}
@Override
public void hide() {
frame.setVisible(false);
}
}
我认为鼠标侦听器会有问题,因为我真的不知道它们是如何工作的,并且认为它们无法访问 x
、y
, width
和 height
变量随时调用,但没有问题。
当我用 createPanel(50, 0, 100, 25, buttonNames)
调用 createPanel()
时出现问题。
这里,x 是 50 而不是 0。显示时,面板向右移动,这是应该的,但它的按钮现在被一些看不见的线切成两半。如果 x = 100,它将完全不可见。
为什么会这样?我错过了什么?
容器内的组件只有在这些组件的边界完全在其中时才会完全显示(没有 LayoutManager)。通过将 x 坐标从 0 更改为 50,您可以移动按钮的位置。如果您不更改其大小或容器的大小,您的 Button 将被切断。
解决此问题的最简单方法是将按钮位置的 x 和 y 替换为 0,并将面板位置的 0 替换为 x 和 y。
编辑:此处存在类似问题:Components not showing in second JPanel