【问题标题】:How to set size of a JSlider?如何设置 JSlider 的大小?
【发布时间】:2014-02-17 17:23:22
【问题描述】:

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

我在 JPanel 中有一个垂直 JSlider,它使用 GridBagLayout 和 GridBagConstraints 来定位面板上的对象。

目前我有以下代码:

    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(经过测试和可读的最小完整示例)。

标签: java swing jslider


【解决方案1】:

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

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,仍然没有任何改变。有什么想法吗?
  • FlowLayout 尊重滑块的首选大小。你需要一个不需要的布局。
  • 我也试过 BorderLayout。两种布局给我的结果的不同之处在于,流布局使滑块在边缘出现“切割”,就像它不适合它的单元格一样,并且边框布局将滑块缩小到一个小尺寸(我当前的问题) .我认为我的问题是主 JPanel 不尊重嵌套 JPanel 的首选大小。并且出于某种原因,使用gbc.gridheight 使嵌套面板跨越两个单元格,不会改变任何东西
  • “我也试过了。”
【解决方案2】:

要更改摆动组件的大小,请使用 setPreferedSize() 方法

setPreferredSize(new Dimension(300, 80));

您可能必须为滑块使用带有 flowLayout 的单独面板,然后将该面板添加到 .一些布局管理器可能不会采用首选大小。

【讨论】:

  • 感谢您的回答。正如我在问题中所写,我尝试了这种方法,但它没有改变任何东西。这很奇怪,因为我虽然 GridBagLayout 应该尊重首选尺寸。不应该吗?
  • 我不熟悉 GridBagLayout,但我在使用 JTable 时遇到了类似的问题。我最终不得不嵌套面板以便 setPreferedSize() 采取。
  • docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html 该链接可能会有所帮助。您可以设置约束,使组件跨越多列或多行。您可能将滑块限制为一个单元格。
  • 谢谢,但正如我在问题中所说,我已经尝试使用 gridy 和 gridheight 来解决这个问题,但没有运气。 setpreferredsize 方法也无济于事。无论如何感谢您的帮助
猜你喜欢
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多