当你不知道你将拥有多少组件以及它们有多大时,你会如何获得一个体面的gui?
例如,用户输入他们想要的文本字段数以及哪些文本字段在有边框的面板中分组,程序会生成此字段.
我一直在使用GridLayout,但问题是它使所有单元格具有相同的宽度和高度,这在所有组件具有相同大小时都很好,但是当我例如具有文本字段和带有多个的边框面板时字段,文本字段伸出或面板被挤压.
我希望所有组件都具有最小尺寸,但仍然可以使用.
现在的示例,使用GridLayout,所有字段都是正常的,单行JTextFields,其中标题为date的面板被完全挤压(它有三个字段),第一级字段是大的.任何人有任何指针?
我正在尝试设置JSplitPane的分隔符位置,但似乎无法正常工作.
这是一个SSCCE:
import java.awt.Color;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
public class JSplitProblem extends JFrame {
public JSplitProblem(){
JPanel upperPanel = new JPanel();
upperPanel.setLayout(new BoxLayout(upperPanel, BoxLayout.X_AXIS));
JPanel leftPanel = new JPanel();
leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
JPanel red = new JPanel();
red.setBackground(Color.red);
leftPanel.add(red);
JPanel rightPanel = new JPanel();
rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
JPanel blue = new JPanel();
blue.setBackground(Color.blue);
rightPanel.add(blue);
upperPanel.add(leftPanel);
upperPanel.add(rightPanel);
JPanel bottomPanel = new JPanel();
bottomPanel.setBackground(Color.black);
JSplitPane mainSplittedPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, upperPanel,bottomPanel);
mainSplittedPane.setOneTouchExpandable(true);
mainSplittedPane.setDividerLocation(0.5);
this.add(mainSplittedPane);
this.setSize(800,600);
this.setResizable(true);
this.setVisible(true);
}
public …
Run Code Online (Sandbox Code Playgroud) 在下面的GridBagLayout代码中,我希望在调整JFrame的大小以使其更小时,可以遵守JButton btn2的指定最小大小.但是当我使JFrame变小时,btn2会小于其最小尺寸然后消失.
有人能指出我正在做错的方向吗?也许我必须设置包含按钮的JPanel的最小大小?
任何帮助表示赞赏,谢谢!
JFrame frame = new JFrame();
frame.setSize(400,300);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel();
panel.setMinimumSize(new Dimension(400,300));
panel.setBackground(Color.RED);
panel.setLayout(new GridBagLayout());
GridBagConstraints gbc = null;
JButton btn1 = new JButton("btn1");
btn1.setPreferredSize(new Dimension(150,50));
btn1.setMinimumSize(new Dimension(150,50));
gbc = new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.NONE,
new Insets(0,0,0,0), 0, 0);
panel.add(btn1, gbc);
JButton btn2 = new JButton("btn2");
btn2.setPreferredSize(new Dimension(150,150));
btn2.setMinimumSize(new Dimension(150,150));
gbc = new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0,0,100,100), 0, 0);
panel.add(btn2, gbc);
frame.getContentPane().add(panel);
frame.setVisible(true);
Run Code Online (Sandbox Code Playgroud) 我GroupLayout
用来管理一些动态生成的数据输入表单中的组件.布局或多或少如此:
*-----------------------------------------------*
| label A | field A |
| label B | field B |
| label C | field C |
*-----------------------------------------------*
Run Code Online (Sandbox Code Playgroud)
我使用2个并行组作为水平布局,使用单个顺序组作为垂直布局.在大多数情况下,一切都很好.
我想将标签的最大宽度(仅仅是实例JLabel
)限制为父级宽度的1/3 JFrame
.如果它JFrame
是一个固定的大小,这将是微不足道的,但我必须处理它被调整大小.
我正在接收ComponentListener.componentResized()
事件,JFrame
但是一旦我收到这样的事件,我就会有点困惑.
我没有运气就试过这种方法:
public void componentResized(ComponentEvent e) {
int maxW = parentFrame.getWidth() / 3;
for (JLabel l : labels) {
l.setMaximumSize( // have also tried setSize() and setPreferredSize()
new Dimension(
Math.min(l.getSize().width, maxW),
l.getMaximumSize().height));
}
groupLayout.invalidateLayout(getContentSpace());
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议一种限制标签宽度的方法吗?
我可能每次都可以从头开始重建布局,但我觉得应该有一种更简单的方法.
我在同一个窗口中有两个JScrollPanes.左侧的那个足够大,可以显示所包含面板的内容.右边的那个不够大,无法显示其内容,因此需要创建一个垂直滚动条.
但正如您所看到的,问题是当出现垂直滚动条时,滚动条会出现在JScrollPane 的内部.它覆盖了内部包含的内容,因此需要水平滚动条来显示所有内容.我想要那个固定的.
我意识到我可以一直打开垂直滚动条,但出于美观原因,我只希望它在必要时出现,而不需要出现水平滚动条.
编辑:我的启动代码很简单:
JScrollPane groupPanelScroller = new JScrollPane(groupPanel);
this.add(groupPanelScroller, "align center");
Run Code Online (Sandbox Code Playgroud)
我正在使用MigLayout(MigLayout.com),但无论我使用什么版面管理器,这个问题似乎都会出现.此外,如果我缩小窗口以使左面板不再大到足以显示所有内容,则会出现与右面板相同的行为.
对于我在Java中创建的GUI应用程序,我有以下内容:
在下列条件下,尺寸调整不会给我任何问题:
当我将JSplitPane移动得太靠近右边时会出现问题,于是调整窗口大小,JSplitPane右侧的JPanel无法遵循我设置的最小宽度.
我尝试在JScrollPane上设置最大宽度,这似乎根本没有帮助.
我必须做一些涉及最大尺寸的事情吗?或者也许有一种方法可以将监听器连接到其中一个面板以强制我想要的行为?最后,我只想让JSplitPane中的右侧面板永远不会小于200px宽.
以下是我遇到的行为示例:
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTree;
public class ResizeTest
{
private JFrame frame;
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
ResizeTest window = new ResizeTest();
window.frame.setVisible(true);
}
catch(Exception e)
{
e.printStackTrace();
}
}
});
}
public ResizeTest()
{
initialize();
}
private void initialize()
{
frame = new JFrame();
frame.setMinimumSize(new Dimension(300, …
Run Code Online (Sandbox Code Playgroud) 我总是在这个覆盖的站点中看到建议,getPreferredSize()
而不是setPreferredSize()
像以前的这些线程中所示那样使用.
看这个例子:
public class MyPanel extends JPanel{
private final Dimension dim = new Dimension(500,500);
@Override
public Dimension getPreferredSize(){
return new Dimension(dim);
}
public static void main(String args[]){
JComponent component = new MyPanel();
component.setPreferredSize(new Dimension(400,400));
System.out.println(component.getPreferredSize());
}
}
Run Code Online (Sandbox Code Playgroud)
setPreferredSize()
- 设置此组件的首选大小.
getPreferredSize()
- 如果preferredSize已设置为非null值,则返回它.如果UI委托的getPreferredSize方法返回非null值,则返回该值; 否则遵从组件的布局管理器.
所以这样做显然打破了Liskov替代原则.
prefferedSize
是一个绑定属性,所以当你设置它时firePropertyChange
执行.所以我的问题是,当你覆盖时,getPrefferedSize()
你不需要覆盖setPreferredSize(..)
吗?
例:
public class MyPanel extends JPanel{
private Dimension dim = null;
@Override
public Dimension …
Run Code Online (Sandbox Code Playgroud) 我有一个快速的问题.
我对Swing有一点经验,最简单的方法是绘制一个相当大的GUI.
作为GUI的一部分,我想要前进和后退按钮.我试图采用的方法是实现将当前JPanel推送到堆栈并检索前一个值的方法(在前向或反向(因此为2个堆栈)).我不能让它工作.也许我会以完全错误的方式解决它,或者堆栈不能以我使用它的方式使用.在任何一种情况下,它真的让我烦恼.我想有可能更简单的方式,如卡布局,但我认为这种方法应该工作,这是非常烦人的.
值得注意的是,我正在使用JFrame"基类"并根据屏幕更改中央JPanel.然而,导航栏是常量,作为"基类"的一部分
这个"基类"的代码:
public class Main_Frame extends JFrame{
static JPanel nav_bar_panel;
JButton home;
JButton back;
JButton forward;
JPanel currentPanel;
static Stack<JPanel> previousPanels;
static Stack<JPanel> forwardPanels;
public Main_Frame(){
super("DEMO");
setSize(800,600);
setLayout(new BorderLayout());
setVisible(true);
add(nav_bar(), BorderLayout.NORTH);
currentPanel = init_display();
add(currentPanel, BorderLayout.CENTER);
previousPanels = new Stack<JPanel>();
forwardPanels = new Stack<JPanel>();
}
private JPanel nav_bar(){
ButtonPressHandler handler = new ButtonPressHandler();
nav_bar_panel = new JPanel(new FlowLayout(FlowLayout.LEFT, 10, 10));
back = new JButton("Back");
back.addActionListener(handler);
home = new JButton("Home");
home.addActionListener(handler);
forward = new JButton("Forward");
forward.addActionListener(handler); …
Run Code Online (Sandbox Code Playgroud) 我有一个流程布局的面板,它可以包含可变数量的项目 - 从1到2000.我想把它放在滚动窗格内,可以在垂直方向滚动,并具有固定的宽度.问题是,当我将面板的首选大小设置为类似(800,600)时,某些项目丢失,并且没有滚动.如果我设置滚动窗格的首选大小,则流窗格中的所有元素都会放在一个很长的行上.
在任何元素上设置最大大小似乎什么都不做 - 布局管理器忽略它.
我怎样才能解决这个问题?
在a中使用时Windows 7
JToolBar
,JToggleButton
有时会截断其标签文本.
请参阅下面的代码中的示例.以大写字母开头的切换按钮'W'
将被截断; 一个以空格(或甚至是小写'w'
)开头的人不会.
这只发生在Windows
?有人可以解释为什么会这样吗?
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6386636
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
/////////////////////// new class
public class Truncation_Example extends JToolBar {
private static final long serialVersionUID = 1L;
/////////////////////// object attributes
JToggleButton toggle_Good;
JToggleButton toggle_Bad;
/////////////////////// constructors
public Truncation_Example() {
toggle_Good = new JToggleButton(new Action_Good());
toggle_Bad = new JToggleButton(new Action_Bad());
this.add(toggle_Good);
this.add(toggle_Bad);
}
/////////////////////// …
Run Code Online (Sandbox Code Playgroud) java ×10
swing ×10
autoresize ×1
grouplayout ×1
jcomponent ×1
jscrollpane ×1
jsplitpane ×1
label ×1
layout ×1
liskov-substitution-principle ×1
resize ×1
scala ×1
scala-swing ×1
stack ×1