相关疑难解决方法(0)

Swing中的变量布局

当你不知道你将拥有多少组件以及它们有多大时,你会如何获得一个体面的gui?

例如,用户输入他们想要的文本字段数以及哪些文本字段在有边框的面板中分组,程序会生成此字段.

我一直在使用GridLayout,但问题是它使所有单元格具有相同的宽度和高度,这在所有组件具有相同大小时都很好,但是当我例如具有文本字段和带有多个的边框面板时字段,文本字段伸出或面板被挤压.

我希望所有组件都具有最小尺寸,但仍然可以使用.

现在的示例,使用GridLayout,所有字段都是正常的,单行JTextFields,其中标题为date的面板被完全挤压(它有三个字段),第一级字段是大的.任何人有任何指针?

java layout swing

11
推荐指数
1
解决办法
5463
查看次数

在JSplitPane上设置分隔符位置不起作用

我正在尝试设置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)

java swing jsplitpane

11
推荐指数
2
解决办法
2万
查看次数

如何让GridBagLayout尊重按钮或面板的最小尺寸?

在下面的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)

java swing layout-manager gridbaglayout

11
推荐指数
2
解决办法
1万
查看次数

Swing GroupLayout:调整和限制组件大小

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)

任何人都可以建议一种限制标签宽度的方法吗?

我可能每次都可以从头开始重建布局,但我觉得应该有一种更简单的方法.

java swing grouplayout

10
推荐指数
1
解决办法
2万
查看次数

当垂直滚动条出现时,JScrollPane不够宽

我在同一个窗口中有两个JScrollPanes.左侧的那个足够大,可以显示所包含面板的内容.右边的那个不够大,无法显示其内容,因此需要创建一个垂直滚动条.

JScrollPane问题

但正如您所看到的,问题是当出现垂直滚动条时,滚动条会出现在JScrollPane 的内部.它覆盖了内部包含的内容,因此需要水平滚动条来显示所有内容.我想要那个固定的.

我意识到我可以一直打开垂直滚动条,但出于美观原因,我只希望它在必要时出现,而不需要出现水平滚动条.

编辑:我的启动代码很简单:

JScrollPane groupPanelScroller = new JScrollPane(groupPanel);
this.add(groupPanelScroller, "align center");
Run Code Online (Sandbox Code Playgroud)

我正在使用MigLayout(MigLayout.com),但无论我使用什么版面管理器,这个问题似乎都会出现.此外,如果我缩小窗口以使左面板不再大到足以显示所有内容,则会出现与右面板相同的行为.

java swing jscrollpane

10
推荐指数
1
解决办法
7231
查看次数

如何在Java中正确设置最小大小?

对于我在Java中创建的GUI应用程序,我有以下内容:

  • 一个JFrame,最小大小为(300,200)
  • 一个JSplitPane,其中包括:
    • 在左边,一个JScrollPane(包含一个JTree),最小大小为(100,0)(我只想将宽度限制为200)
    • 在右边,一个最小尺寸为(200,0)的JPanel

在下列条件下,尺寸调整不会给我任何问题:

  • 将JSplitPane一直调整到左侧(到JScrollPane的最小大小),然后调整窗口大小
  • 只是在一定程度上调整窗口大小

当我将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)

java swing resize autoresize

10
推荐指数
1
解决办法
4万
查看次数

重写getPreferredSize()会破坏LSP

我总是在这个覆盖的站点中看到建议,getPreferredSize() 而不是setPreferredSize() 像以前的这些线程中所示那样使用.

  1. 使用重写getPreferredSize()而不是对固定大小的组件使用setPreferredSize()
  2. 我应该避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法吗?
  3. 重写setPreferredSize()和getPreferredSize()

看这个例子:

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)

java swing liskov-substitution-principle jcomponent

10
推荐指数
2
解决办法
924
查看次数

在Swing中实现后退/前进按钮

我有一个快速的问题.

我对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)

java swing stack

9
推荐指数
2
解决办法
3万
查看次数

如何仅使用流布局设置Panel的首选宽度?

我有一个流程布局的面板,它可以包含可变数量的项目 - 从1到2000.我想把它放在滚动窗格内,可以在垂直方向滚动,并具有固定的宽度.问题是,当我将面板的首选大小设置为类似(800,600)时,某些项目丢失,并且没有滚动.如果我设置滚动窗格的首选大小,则流窗格中的所有元素都会放在一个很长的行上.

在任何元素上设置最大大小似乎什么都不做 - 布局管理器忽略它.

我怎样才能解决这个问题?

java swing scala scala-swing

9
推荐指数
2
解决办法
1万
查看次数

JToggleButton截断标签文本

在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 swing label jtogglebutton

9
推荐指数
1
解决办法
638
查看次数