【发布时间】:2017-10-20 03:06:46
【问题描述】:
所以这段代码明确表示JPanelselectPanel 应该有三行一列,但是,当我运行它时,我得到了这个结果,只是无法弄清楚我做错了什么。大部分代码与我认为的问题无关。开头是我制作给我带来问题的面板(selectPanel),结尾是将该面板添加到 JFrame 的地方(roiguide)。
代码结果:
JPanel selectPanel = new JPanel();
selectPanel.setLayout(new GridLayout(3,1,0,0));
selectPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
imp.getWindow().toFront();
IJ.setTool(Toolbar.RECTANGLE);
referenceButton = new JButton("Add reference region");
referenceButton.setEnabled(true);
referenceButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
refDefine();
}
});
refLabel = new JLabel(" ("+printformat.format(rno)+"/1)");
selectPanel.add(referenceButton);
selectPanel.add(refLabel);
backgroundButton = new JButton("Add background region");
backgroundButton.setEnabled(true);
backgroundButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
brDefine();
}
});
backgroundLabel = new JLabel(" ("+printformat.format(bno)+"/"+printformat.format(spotno)+")");
selectPanel.add(backgroundButton);
selectPanel.add(backgroundLabel);
spotButton = new JButton("Add spot");
spotButton.setEnabled(true);
spotButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
spotDefine();
}
});
spotLabel = new JLabel(" ("+printformat.format(sno)+"/"+printformat.format(spotno)+")");
selectPanel.add(spotButton);
selectPanel.add(spotLabel);
JPanel editPanel = new JPanel();
selectPanel.setLayout(new GridLayout(2,1,20,20));
selectPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
jComboBox1 = new JComboBox();
editPanel.add(jComboBox1);
JButton editButton = new JButton("Edit ROIs");
editButton.setEnabled(true);
editButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
String item = (String) jComboBox1.getSelectedItem();
Roi roi = overlay.get(overlay.getIndex(item));
}
});
editPanel.add(editButton);
// Create the buttonPanel, which has the "Cancel" and "OK" buttons
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(1,2,20,20));
buttonPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
JButton cancelButton = new JButton("Cancel");
cancelButton.setEnabled(true);
cancelButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
didCancel = true;
roiguide.dispose();
overlay.clear();
}
});
buttonPanel.add(cancelButton);
JButton okButton = new JButton("OK");
okButton.setEnabled(true);
okButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(current!=roino){
IJ.error("ROI Manager","Please select " + roino + " regions of interest.");
}else{
canContinue=true;
roiguide.dispose();
}
}
});
buttonPanel.add(okButton);
// Create and populate the JFrame
roiguide = new JFrame("Add regions of interest:");
roiguide.getContentPane().add(selectPanel, BorderLayout.NORTH);
roiguide.getContentPane().add(editPanel, BorderLayout.WEST);
roiguide.getContentPane().add(buttonPanel, BorderLayout.EAST);
roiguide.pack();
roiguide.setLocation(400,400);
roiguide.setVisible(true);
roiguide.setResizable(false);
【问题讨论】:
-
Most of this code is not relevant to the problem I think.- 你说得对。您的问题是关于组件的布局。那么,你为什么要编写一个完整的类而不进行基本测试呢?创建一个适当的minimal reproducible example 发布。很有可能你会发现问题。因此,您只需要一个带有使用 GridLayout 的面板的 JFrame 和要添加到面板的 3 个组件。如果这不起作用,那么您可以发布一个简单/完整的课程。首先让它工作,然后转到下一步并添加另一个面板。一旦面板正确显示,您就开始添加 ActionListener。 -
附带说明,在进行 pack() 操作之前,应将框架设置为不可调整大小,否则大小将不正确,因为边框大小会发生变化。
-
@camickr 它在整个测试过程中都能正常运行,并且添加的新功能破坏了原始功能的显示。不过我会按照你说的调试,谢谢。
标签: java swing layout-manager grid-layout