细心的匕首 · 深度学习GPU环境配置及建模(Python) ...· 1 年前 · |
谈吐大方的木瓜 · c - CUDA driver API ...· 1 年前 · |
体贴的柿子 · Java 线程池 ...· 1 年前 · |
非常酷的莴苣 · Flutter入門教學 – ...· 1 年前 · |
率性的黄瓜 · Python内存问题:提示和技巧-51CTO ...· 1 年前 · |
大家好!我试图解决一个显然很简单的问题,但我不能解决它。我正在开发一个使用Java/Swing库的示例应用程序;我有一个JFrame和一个JPanel。我只想实现以下目标:
setPreferredSize()方法。不能在此大小下调整大小。
我试过使用GridBagLayout:这是我唯一能做到的方法。
请看下面的示例:
/* file StackSample01.java */
import java.awt.*;
import javax.swing.*;
public class StackSample01 {
public static void main(String [] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(100, 100));
panel.setBackground(Color.RED);
frame.setLayout(new GridBagLayout());
frame.add(panel, new GridBagConstraints());
frame.setSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
Here 一个截图:
我不会使用GridBagLayout来做一件太简单的事情。我尝试了一个最简单的解决方案,通过使用Box,但这不起作用:
示例代码:
/* file StackSample02.java */
import java.awt.*;
import javax.swing.*;
public class StackSample02 {
public static void main(String [] args) {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(100, 100));
panel.setBackground(Color.RED); // for debug
panel.setAlignmentX(JComponent.CENTER_ALIGNMENT); // have no effect
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalGlue());
box.add(panel);
box.add(Box.createVerticalGlue()); // causes a deformation
frame.add(box);
frame.setSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
Here 一个截图,
有什么想法吗?感谢所有人:-)
使用
panel.setMaximumSize(new Dimension(200,200));
panel.setResizable(false)
而不是?
BoxLayout
可以很好地保存您的setXxxSize(),然后只需添加
panel.setMaximumSize(new Dimension(100, 100));
你的输出将会是
容器已被setMinimumSize删除(注意容器是否具有更大的大小... )
import java.awt.*;
import javax.swing.*;
public class CustomComponent12 extends JFrame {
private static final long serialVersionUID = 1L;
public CustomComponent12() {
Box box = new Box(BoxLayout.Y_AXIS);
box.setAlignmentX(JComponent.CENTER_ALIGNMENT);
box.add(Box.createVerticalGlue());
box.add(new CustomComponents12());
box.add(Box.createVerticalGlue());
add(box);
pack();
setTitle("Custom Component Test / BoxLayout");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setMaximumSize(getMinimumSize());
setMinimumSize(getMinimumSize());
setPreferredSize(getPreferredSize());
setLocation(150, 150);
setVisible(true);
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
CustomComponent12 main = new CustomComponent12();
javax.swing.SwingUtilities.invokeLater(r);
class CustomComponents12 extends JPanel {
private static final long serialVersionUID = 1L;
@Override
public Dimension getMinimumSize() {
return new Dimension(100, 100);
@Override
public Dimension getMaximumSize() {
return new Dimension(100, 100);
@Override
public Dimension getPreferredSize() {
return new Dimension(100, 100);
@Override
public void paintComponent(Graphics g) {
int margin = 10;
Dimension dim = getSize();
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
}
首先,感谢所有人。
我再次回答我自己的问题,向大家展示我所做的选择。请参阅下面的示例代码;正如您所看到的,我只包含了实现目标所必需的最小步骤。
/* file StackResponse.java */
import java.awt.*;
import javax.swing.*;
public class StackResponse {
public static void main(String [] args) {
JPanel panel = new JPanel();
Dimension expectedDimension = new Dimension(100, 100);
panel.setPreferredSize(expectedDimension);
panel.setMaximumSize(expectedDimension);
panel.setMinimumSize(expectedDimension);
panel.setBackground(Color.RED); // for debug only
Box box = new Box(BoxLayout.Y_AXIS);
box.add(Box.createVerticalGlue());
box.add(panel);
box.add(Box.createVerticalGlue());
JFrame frame = new JFrame();
frame.add(box);
frame.setSize(new Dimension(200, 200));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setMinimumSize(frame.getMinimumSize()); // cannot be resized-
frame.setVisible(true);
}
Here 你可以看到一个截图。
问题解决了。再次感谢所有人。
它
你可以做到这一点。我必须做一个国际象棋游戏,我希望棋子总是放在一个JlayeredPane细胞的中心:
private void formMouseReleased(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
if (jl != null)
jl.setLocation(evt.getX()+10, evt.getY()+10);
Component com = findComponentAt(evt.getPoint());
if (com instanceof JPanel)
// System.out.println("Yes, it's a jpanel");
((JPanel)com).add(jl);
((JPanel)com).validate();
}
它只是拥有
jPanel.setBounds(x,y,1046,503);
其中x是右侧的空间,y是左侧的空间。您必须根据屏幕的高度和宽度从两侧计算空间
使用GridBagLayout创建一个名为" FixedPanel“的面板,将首选大小设置为frame size,然后将您的frame添加到FixedPanel中。
Frame = new JFrame("CenterFrame");
Frame.setLocation(0, 0);
Frame.setSize(new Dimension(400,400));//dim
JPanel FixedPanel = new JPanel(new GridBagLayout());
FixedPanel.setPreferredSize(Frame.getSize());
JPanel myPanel = new JPanel();