Java ImageIcon扩展到窗口之外,调整窗口大小将扩展所有组件,而不是显示更多组件
我在上面创建框架,然后创建8个面板。我创建了各种组件,并将它们添加到面板中,一切正常。直到我创建了一个ImageIcon并将其添加到标签,然后将该标签添加到第八个面板。使用的图像为140x129像素。问题是,只有顶层。。。。可能有四分之一的图像在显示。如果我更改代码中的帧尺寸,每个面板之间会创建更多的空白,但只会显示稍微多一点的图像,因此图像仍然不在屏幕上。我要说的是,窗口很容易为它显示的图像的每多一个像素增加10个像素的间距。如果我拖动窗口的角来展开它,同样的事情也会发生。如果窗口最大化,我仍然只能看到我现在非常拉伸的图像的一半多一点 我尝试过的事情:Java ImageIcon扩展到窗口之外,调整窗口大小将扩展所有组件,而不是显示更多组件,java,user-interface,imageicon,Java,User Interface,Imageicon,我在上面创建框架,然后创建8个面板。我创建了各种组件,并将它们添加到面板中,一切正常。直到我创建了一个ImageIcon并将其添加到标签,然后将该标签添加到第八个面板。使用的图像为140x129像素。问题是,只有顶层。。。。可能有四分之一的图像在显示。如果我更改代码中的帧尺寸,每个面板之间会创建更多的空白,但只会显示稍微多一点的图像,因此图像仍然不在屏幕上。我要说的是,窗口很容易为它显示的图像的每多一个像素增加10个像素的间距。如果我拖动窗口的角来展开它,同样的事情也会发生。如果窗口最大化,我仍
添加f.pack()会生成一个非常高的瘦窗口(窗口高度比我的屏幕高),但它仍然像我手动扩展窗口时一样(面板之间空白,图像部分脱离屏幕),即使我取出f.setBounds并仅使用f.setLocation。您使用的是GridLayout。这使所有封闭面板具有相同的空间量。在这种情况下,它是一个垂直网格 你可能应该使用一些不同的东西。我可以尝试在JFrame中使用BorderLayout,将包含前七个面板(在GridLayout中)的a面板放在中间,然后将JLabel放在JFrame的南部 还有其他方法来布置,但这是我能想到的第一种方法。使网格中的每个单元格大小相同,每个单元格的大小由网格中包含的最大单元格决定 在代码中,图标是最大的组件,并且网格中只有一列,因此每一行的高度都与图标相同 由于还可以通过调用方法
setBounds()
来限制JFrame
的大小,因此Swing基础结构会切断图标,以便所有组件都符合指定的边界
一种替代方法(但不是唯一的方法)是使用,因为它使用每个包含组件的首选尺寸
下面是一个示例GUI,它与您发布的屏幕截图相匹配,并使用BoxLayout
import static javax.swing.WindowConstants.EXIT\u ON\u CLOSE;
导入java.awt.BorderLayout;
导入java.awt.EventQueue;
导入java.net.URL;
导入javax.swing.BoxLayout;
导入javax.swing.Icon;
导入javax.swing.ImageIcon;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JRadioButton;
导入javax.swing.JTextField;
公共类Shapes23实现可运行{
私有JFrame;
@重写//java.lang.Runnable
公开募捐{
showGui();
}
私有JPanel CreateEighthow(){
JPanel=新的JPanel();
URL=getClass().getResource(“paintbursht.jpg”);
Icon ico=新图像图标(url);
JLabel标签=新的JLabel(ico);
添加(标签);
回投;
}
私有JPanel CreateFiftThrow(){
JPanel fifthorn=新的JPanel();
JTextField textField=新的JTextField(20);
添加(文本字段);
回投;
}
私有JPanel createFirstRow(){
JPanel firstRow=新的JPanel();
JLabel标签=新的JLabel(“二维形状”);
第一行。添加(标签);
返回第一行;
}
私有JPanel createFourthRow(){
JPanel fourthRow=新的JPanel();
添加(createRadioButton(“球体”));
添加(createRadioButton(“立方体”));
添加(createRadioButton(“Cone”));
添加(createRadioButton(“圆柱体”));
添加(createRadioButton(“圆环”));
回击四投;
}
私有JPanel createMainPanel(){
JPanel mainPanel=新的JPanel();
BoxLayout布局=新的BoxLayout(主面板,BoxLayout.PAGE_轴);
主面板。设置布局(布局);
添加(createFirstRow());
添加(createSecondRow());
添加(createThirdRow());
添加(createFourthRow());
添加(createfifthorn());
添加(createSixthRow());
添加(createSeventhRow());
添加(createEightrow());
返回主面板;
}
私有JRadioButton createRadioButton(字符串文本){
JRadioButton radioButton=新的JRadioButton(文本);
返回单选按钮;
}
私有JPanel createSecondRow(){
JPanel secondRow=新的JPanel();
添加(createRadioButton(“圆圈”));
添加(createRadioButton(“矩形”);
添加(createRadioButton(“方形”));
添加(createRadioButton(“三角形”));
返回第二行;
}
私有JPanel createSeventhRow(){
JPanel seventhRow=新的JPanel();
JButton按钮=新JButton(“输入”);
第七行。添加(按钮);
private void setupGUI(){
// Setup Frame
f = new JFrame("Shape Image Generator");
f.setBounds(500, 150, 450, 350);
f.setLayout(new GridLayout(8,1));
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent){
System.exit(0);
}
});
}
ImageIcon iconStart = createImageIcon("/images/ShapeClipart.png", "Shapes");
JLabel imgLabel = new JLabel();
row8.add(imgLabel);
// Add image to image label
imgLabel.setIcon(iconStart);
// Add panels to frame
f.add(row1);
f.add(row2);
f.add(row3);
f.add(row4);
f.add(row5);
f.add(row6);
f.add(row7);
f.add(row8);
f.setVisible(true);