如何正确显示按钮?
继承我的代码:
import javax.swing.*;
import java.awt.*;
public class cal extends JFrame
{
private JLabel monthnym, monnym,tuesnym,wednym,thunym,frinym,satnym,sunnym;
private JButton b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,
b19,b20,b21,b22,b23,b24,b25,b26,b27,b28,b29,b30;
private JPanel panel1, panel2, panel3,panel4;
public cal()
{
super("November");
Container c = getContentPane();
c.setLayout(new GridLayout(7,5));
panel1=new JPanel(new GridLayout(1,0));
monthnym=new JLabel("November 2013");
panel1.add(monthnym);
panel2=new JPanel(new GridLayout(1,7,2,2));
sunnym=new JLabel("SUN");
monnym=new JLabel("MON");
tuesnym=new JLabel("TUE");
wednym=new JLabel("WED");
thunym=new JLabel("THU");
frinym=new JLabel("FRI");
satnym=new JLabel("SAT");
panel2.add(sunnym);
panel2.add(monnym);
panel2.add(tuesnym);
panel2.add(wednym);
panel2.add(thunym);
panel2.add(frinym);
panel2.add(satnym);
panel3=new JPanel(new GridLayout(5,7,3,3));
b1=new JButton("1");
b2=new JButton("2");
b3=new JButton("3");
b4=new JButton("4");
b5=new JButton("5");
panel3.add(b1);
panel3.add(b2);
panel3.add(b3);
panel3.add(b4);
panel3.add(b5);
//panel4=new JPanel(new GridLayout(4,7,5,5));
c.add(panel1);
c.add(panel2);
c.add(panel3);
//c.add(panel4);
setSize(500,500);
show();
}
public static void main(String[] args) {
cal app = new cal();
}
}
我编辑我的代码severwal次,但没有运气。 我认为(x,y)中存在某些东西,但我没有任何改变。
并且这些按钮是30,我将其减少到5,因为我在发布此问题时出错
答案 0 :(得分:3)
基本上,GridLayout
正在为它认为需要的空间保留空间,但是因为它想要的区域比你提供的区域大,所以它被挤压了所有东西。
如果我将内容窗格的布局管理器从c.setLayout(new GridLayout(7, 5));
更改为c.setLayout(new BorderLayout());
,我会...
我的第一个建议是使用更好的布局。您已经将代码分解为单独的组件,这是一个良好的开端,您可以为每个部分使用不同的布局管理器来生成更好的布局。
如果它根本不适合(合理的)屏幕,您可能需要考虑将UI放入JScrollPane
...
您还应该使用JFrame#pack
来确定主框架的尺寸,而不是setSize
。
看看A Visual Guide to Layout Managers的一些想法。
接下来,我建议您生成一个维护基本内容的自定义组件,以便您可以重复使用。
我还建议您查看Initial Threads并确保在事件调度线程的上下文中构建UI以防止可能出现的问题。
我还鼓励您将按钮放入数组或某种类型的List
,而不是创建30个命名变量...恕我直言
答案 1 :(得分:2)
试试这个:
c.setLayout(new GridLayout(3,5));
和
panel3=new JPanel(new GridLayout(1,7,1,1));
答案 2 :(得分:2)
根据@MadProgrammer的建议,尝试为面板使用不同的LayoutManagers。我稍微改变了你的代码。我为您的容器设置了GridBagLayout
,现在它看起来更好。
public class Form extends JFrame {
private JLabel monthnym, monnym, tuesnym, wednym, thunym, frinym, satnym,
sunnym;
private JPanel panel1, panel2, panel3;
public Form() {
super("November");
Container c = getContentPane();
c.setLayout(new GridBagLayout());
panel1 = new JPanel(new GridLayout(1, 0));
monthnym = new JLabel("November 2013");
panel1.add(monthnym);
panel2 = new JPanel(new GridLayout(1, 0));
sunnym = new JLabel("SUN");
monnym = new JLabel("MON");
tuesnym = new JLabel("TUE");
wednym = new JLabel("WED");
thunym = new JLabel("THU");
frinym = new JLabel("FRI");
satnym = new JLabel("SAT");
panel2.add(sunnym);
panel2.add(monnym);
panel2.add(tuesnym);
panel2.add(wednym);
panel2.add(thunym);
panel2.add(frinym);
panel2.add(satnym);
panel3 = new JPanel(new GridLayout(5, 7));
for(int i =0;i<30;i++){
JButton b = new JButton(""+i);
panel3.add(b);
}
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 5, 5, 5);
gbc.fill = GridBagConstraints.BOTH;
gbc.gridy =0;
c.add(panel1,gbc);
gbc.gridy++;
c.add(panel2,gbc);
gbc.gridy++;
c.add(panel3,gbc);
pack();
setVisible(true);
}
public static void main(String[] args) {
Form app = new Form();
}
}
同时使用pack()
代替setSize()
,setVisible(true)
代替弃用show()