如何设置JSlider的大小?

3

我已经在网上搜索解决此问题的方法,但没有找到有效的方法。

我有一个使用GridBagLayout和GridBagConstraints放置对象的JPanel中的垂直JSlider。

目前我的代码如下:

    gbc.gridy = 1;
    add(button1,gbc);

    gbc.gridy = 2;
    add(button2,gbc);

    gbc.gridy = 3;
    add(slider,gbc);

对象沿面板垂直放置。
滑块始终具有相同的大小(长度)。尝试使用setPreferredSize - 无效。尝试使用gridheight以便使滑块跨越两行 - 也不起作用。尝试更改滑块的实际最小和最大值,没有帮助。
GridBagLayout应该尊重首选大小吗?
编辑:还尝试创建另一个JPanel在主JPanel内部,将其布局设置为FlowLayout、BoxLayout或GridLayout,并将滑块添加到其中。仍然没有变化,非常奇怪。
有什么想法吗?

为了更快地获得帮助,请发布一个MCTaRE(最小完整可测试且可读的示例)。 - Andrew Thompson
3个回答

3

使用不同的布局管理器(或将滑块放置在嵌套的JPanel中,并使用不同的布局管理器),以拉伸JSlider。在示例中,我使用了BorderLayout

enter image description here

import java.awt.BorderLayout;
import java.awt.GridLayout;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;

public class DifferentSizeSlider extends JPanel{
    public DifferentSizeSlider() {
        JPanel topPanel = new JPanel(new BorderLayout());
        topPanel.add(new JSlider());

        JPanel bottomPanel = new JPanel(new GridLayout(1, 2));
        bottomPanel.add(new JSlider());
        bottomPanel.add(new JPanel());

        setLayout(new GridLayout(2, 1));
        add(topPanel);
        add(bottomPanel);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JOptionPane.showMessageDialog(null, new DifferentSizeSlider());
            }
        });
    }
}

编辑您的代码示例

在此处输入图片描述

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingUtilities;

public class DifferentSizeSlider extends JPanel{
    public DifferentSizeSlider() {
        JPanel topPanel = new JPanel(new BorderLayout());
        topPanel.setPreferredSize(new Dimension(400, 50));
        topPanel.add(new JSlider());

        JButton jbtOne = new JButton("Button");
        JButton jbtTwo = new JButton("Button");

        GridBagConstraints gbc = new GridBagConstraints();
        setLayout(new GridBagLayout());

        gbc.gridy = 0;
        add(jbtOne,gbc);  

        gbc.gridy = 1;
        add(jbtTwo,gbc);

        gbc.gridy = 2;
        add(topPanel, gbc);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JOptionPane.showMessageDialog(null, new DifferentSizeSlider());
            }
        });
    }
}

谢谢,但不知何故它仍然不起作用。我将我的 JSlider 放在 FlowLayout 的 JPanel 中,并为 JPanel 设置了首选大小,然后将其添加到主要的 JPanel 中,但仍然没有改变任何东西。尝试了几种不同的首选大小,仍然没有帮助。尝试了 BorderLayout、BoxLayout 和 GridLayout,但仍然没有改变。有什么想法吗? - Aviv Cohn
FlowLayout会尊重滑块的首选大小,你需要一个不会这样做的布局。 - Paul Samsotha
1
我也尝试过BorderLayout。两种布局的不同之处在于,流式布局使滑块在边缘处出现“剪裁”的外观,就像它不适合它的单元格一样,而边框布局则将滑块缩小到了很小的大小(这是我的当前问题)。我认为我的问题在于主面板没有遵守嵌套面板的首选大小。出于某种原因,使用gbc.gridheight使嵌套面板跨越两个单元格并不能改变任何东西。 - Aviv Cohn
"我也尝试过..." - Andrew Thompson

1
要更改Swing组件的大小,您可以使用setPreferredSize()方法。
setPreferredSize(new Dimension(300, 80));

您可能需要使用一个带有FlowLayout的单独面板来放置滑块,然后将该面板添加到主面板中。某些布局管理器可能不会采用首选大小。


1
谢谢您的回答。正如我在问题中所写的,我尝试了这种方法,但它并没有改变任何东西。这很奇怪,因为我认为GridBagLayout应该尊重首选大小。不是吗? - Aviv Cohn
我不熟悉GridBagLayout,但我在使用JTable时遇到了类似的问题。最终我不得不嵌套面板以便setPrefferedSize()生效。 - Jason White
这个链接可能会有帮助:http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html。你可以设置约束条件,使组件跨越多列或多行。你可能正在将滑块限制在一个单元格中。 - Jason White
1
谢谢,但正如我在问题中所说的,我已经尝试使用gridy和gridheight来解决这个问题,但没有成功。另外,setpreferredsize方法也没有帮助。无论如何,还是感谢你的帮助。 - Aviv Cohn

0
有点晚了,但是我之前也遇到了一个GridBagLayout的问题,并通过将JSlider的GridBagConstraints的weighty(或者对于垂直滑块来说是weightx)设置为1来解决它,当将其添加到一个嵌套的JPanel中。
// parent container ...
JFrame f = new JFrame();

JPanel p = new JPanel(new GridBagLayout()); // nested jpanel, parent to the slider

f.add(p);

GridBagConstraints c = new GridBagConstraints;

c.weighty = 1; // slider will stretch to fill

JSlider slider = new JSlider();

p.add(slider, c);

这意味着JSlider可以拉伸以填充父级JPanel。将weighty设置为0表示不拉伸,0.5表示组件的拉伸程度是父容器的一半,1表示完全拉伸。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接