Swing 如何使用GridBagLayout修改此视图

Swing 如何使用GridBagLayout修改此视图,swing,jbutton,jlabel,gridbaglayout,jspinner,Swing,Jbutton,Jlabel,Gridbaglayout,Jspinner,如果您能帮助我修改此界面,我将不胜感激。我刚刚开始学习GridBagLayout,我想知道如何使用GridBagLayout()实现绘制的接口 请在附件中找到一个工作示例 import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import javax.swing.JButton; import javax.swin

如果您能帮助我修改此界面,我将不胜感激。我刚刚开始学习GridBagLayout,我想知道如何使用GridBagLayout()实现绘制的接口

请在附件中找到一个工作示例

import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;

public class Sample extends JPanel
{

    private JLabel labelFileName = new JLabel("Playing File:");
    private JLabel labelTimeCounter = new JLabel("00:00:00");
    private JLabel labelDuration = new JLabel("00:00:00");

    private JButton buttonOpen   = new JButton("  Open  ");
    private JButton buttonPlay   = new JButton("  Play  ");
    private JButton buttonPause  = new JButton("  Pause ");
    private JButton buttonRewind = new JButton(" Rewind ");
    private JButton buttonSave   = new JButton("  Save  ");

    private JSlider sliderTime = new JSlider();

    GridBagConstraints constraints = new GridBagConstraints();

    public Sample() 
    {

        setLayout(new GridBagLayout());

        constraints.insets = new Insets(5, 5, 5, 5);

        sliderTime.setValue(0);

        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 5; 
        constraints.fill = GridBagConstraints.HORIZONTAL;
        add(labelFileName, constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth = 1; 
        add(labelTimeCounter, constraints);

        constraints.gridx = 1;
        constraints.gridy = 1;
        constraints.gridwidth = 3; 
        add(sliderTime, constraints);

        constraints.gridx = 4;
        constraints.gridy = 1;
        constraints.gridwidth = 1; 
        add(labelDuration, constraints);

        JPanel panelButtons = new JPanel(new FlowLayout(FlowLayout.LEFT, 25, 5));
        panelButtons.add(buttonOpen);
        panelButtons.add(buttonPlay);
        panelButtons.add(buttonPause);
        panelButtons.add(buttonRewind);
        panelButtons.add(buttonSave);

        constraints.gridx = 0;
        constraints.gridy = 2;
        add(panelButtons, constraints);

    }

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            @Override
            public void run() 
            {
                runApp();

            }
        });
    }

    public static void runApp() 
    {
        JFrame frame = new JFrame("Frame");
        frame.setVisible(true);
        frame.setSize(800, 200);
        frame.add( new Sample());
        frame.setDefaultCloseOperation
    }
}


谢谢

我强烈建议使用一列三行网格

  • 顶行可以是设置为flowlayout的面板,也可以直接插入标签。由您设置标签的大小。布局管理器不能为您这样做
  • 中间一行将是一个边界布局,其中微调器设置为中心,两个标签放置在东和西
  • 最下面一行应该是带有流程布局的面板集。要使按钮在图表中保持良好的间距,只能使用flowlayout

我唯一担心的是滑块面板可能会在垂直方向上调整大小。在这种情况下,您可能希望放弃GridBaglayout,只在顶部有一个borderlayout,其中最上面的一行是中心,最下面的两行被打包到一个位于南部的面板中。

您最好使用一些可以调试布局的工具。除此之外:
slidetime
的宽度应为3,而不是2<代码>面板按钮的宽度应为5,而不是1。另外,您可能希望将第二列的权重X设置为正值。不要忘记
frame.setDefaultCloseOperation
。无法忍受人们在mcve中忘记这一点。如果我忘记添加它,很多时候我在测试时会得到一百万个后台程序:-)@peeskillet edited:)@Ordous constraints.gridwidth=5对于panelButtons解决了80%的问题,这个答案看起来不错,但是,我想用GridBagLayout()来做界面。我知道如何使用其他布局来修复它,但我的问题的目的是学习更多的GridBagLayout。当然,您仍在部分使用GridBagLayout。您的图表实际上不适合100%使用GridBagLayout。你也许能做到,但那将是相当困难的。按钮和滑块与任何列都不匹配,因此在您的情况下,我只能看到3x1网格。非常感谢,这很有帮助
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;

public class Sample extends JPanel
{

    private JLabel labelFileName = new JLabel("Playing File:");
    private JLabel labelTimeCounter = new JLabel("00:00:00");
    private JLabel labelDuration = new JLabel("00:00:00");

    private JButton buttonOpen   = new JButton("  Open  ");
    private JButton buttonPlay   = new JButton("  Play  ");
    private JButton buttonPause  = new JButton("  Pause ");
    private JButton buttonRewind = new JButton(" Rewind ");
    private JButton buttonSave   = new JButton("  Save  ");

    private JSlider sliderTime = new JSlider();

    GridBagConstraints constraints = new GridBagConstraints();

    public Sample() 
    {

        setLayout(new GridBagLayout());

        constraints.insets = new Insets(5, 5, 5, 5);

        sliderTime.setValue(0);

        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 5; 
        constraints.fill = GridBagConstraints.HORIZONTAL;
        add(labelFileName, constraints);

        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth = 1; 
        add(labelTimeCounter, constraints);

        constraints.gridx = 1;
        constraints.gridy = 1;
        constraints.gridwidth = 3; 
        add(sliderTime, constraints);

        constraints.gridx = 4;
        constraints.gridy = 1;
        constraints.gridwidth = 1; 
        add(labelDuration, constraints);

        JPanel panelButtons = new JPanel(new FlowLayout(FlowLayout.LEFT, 25, 5));
        panelButtons.add(buttonOpen);
        panelButtons.add(buttonPlay);
        panelButtons.add(buttonPause);
        panelButtons.add(buttonRewind);
        panelButtons.add(buttonSave);

        constraints.gridx = 0;
        constraints.gridy = 2;
        add(panelButtons, constraints);

    }

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            @Override
            public void run() 
            {
                runApp();

            }
        });
    }

    public static void runApp() 
    {
        JFrame frame = new JFrame("Frame");
        frame.setVisible(true);
        frame.setSize(800, 200);
        frame.add( new Sample());
        frame.setDefaultCloseOperation
    }