簡體   English   中英

單選按鈕的垂直滾動條

[英]Vertical Scroll Bar for Radio Buttons

我是一個非常新的java程序員。

我正在嘗試創建一個帶有滾動條的垂直單選按鈕列表。 我的代碼不會以指定大小生成窗口,也不會實際出現滾動條。

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;

public class RadioButtonScroller {
    private List<String> abcList = new ArrayList<>(Arrays.asList("Aa", "Bb", "Cc", "Dd", "Ee", "Ff", "Gg", "Hh", "Ii",
            "Jj", "Kk", "Ll", "Mm", "Nn", "Oo", "Pp", "Qq", "Rr", "Ss", "Tt", "Uu", "Vv", "Ww", "Xx", "Yy", "Zz"));
    private JRadioButton pickButton;
    private JFrame jframe = new JFrame("Select one:");
    private JScrollPane scrollPane;
    private JPanel panel = new JPanel();
    private Box vertBox;

    public RadioButtonScroller() {
        createUI();
    }

    public void setRadioButtons() {
        ButtonGroup group = new ButtonGroup();

        for (int i = 0; i < abcList.size(); i++) {
            String theseLetters = abcList.get(i);
            pickButton = new JRadioButton(theseLetters);

            group.add(pickButton);
            vertBox.add(pickButton);
        }
    }

    private void createUI() {
        //centers on screen
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        jframe.setLocationRelativeTo(null);
        jframe.setLocation(dim.width / 3 - jframe.getSize().width / 3, dim.height / 4 - jframe.getSize().height / 4);

        vertBox = Box.createVerticalBox();
        jframe.setSize(300, 525);
        vertBox.setSize(300, 525);
        jframe.setVisible(true);

        panel.setLayout(new FlowLayout());
        jframe.add(panel);
        scrollPane = new JScrollPane(vertBox);
        scrollPane.setSize(300, 525);
        scrollPane.getVerticalScrollBar();
        panel.add(scrollPane);

        jframe.pack();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setRadioButtons();
    }

    public static void main(String[] args) {
        RadioButtonScroller radioButtonScroller = new RadioButtonScroller();
    }
}

我之前已經成功地將 JFrame 與 Vbox 一起使用,但是 JPanel 和 JScrollPane 的添加讓我感到困惑。

(由於某些兼容性問題,我無法使用 JavaFX。必須處於擺動狀態。)

非常感謝。

它是您在panel.setLayout(new FlowLayout());中使用的布局panel.setLayout(new FlowLayout()); . JScrollPane流布局“不能很好地工作”。 您可以更改布局,您將獲得一個功能性滾動窗格,而無需做額外的事情。 (為了使流布局與 JScrollPane 一起工作,您必須進一步調查,可能使用組件偵聽器等)

在您的情況下,我將使用具有 1 列、無限行的 GridLayout:

panel.setLayout(new GridLayout(0, 1));

或者一個帶有 y 軸的 BoxLayout:

panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

此外,這些行沒有任何作用:

scrollPane.setSize(300, 525);
scrollPane.getVerticalScrollBar();

滾動窗格的大小將從父容器計算,即 JFrame 的內容窗格。

這里有很多布局問題

  1. 大多數情況下,布局管理器不考慮組件的大小,而是考慮其首選大小。
  2. JScrollPane 的大小由其視口的首選大小控制。
  3. FlowLayout 非常基本且無情,通常不適用於復雜的組合布局。
  4. 不要打包 JFrame之后添加組件而是在之前。 否則組件和布局管理器不會相應地調整自己的大小。

例如,

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.*;

@SuppressWarnings("serial")
public class RadioButtonScroller2 extends JPanel {
    private List<String> abcList = new ArrayList<>(Arrays.asList("Aa", "Bb", "Cc", "Dd", "Ee", "Ff", "Gg", "Hh", "Ii",
            "Jj", "Kk", "Ll", "Mm", "Nn", "Oo", "Pp", "Qq", "Rr", "Ss", "Tt", "Uu", "Vv", "Ww", "Xx", "Yy", "Zz"));
    private ButtonGroup buttonGroup = new ButtonGroup();

    public RadioButtonScroller2() {
        JPanel radioPanel = new JPanel(new GridLayout(0, 1));
        ItemListener il = itemEvent -> {
            if (itemEvent.getStateChange() == ItemEvent.SELECTED) {
                AbstractButton btn = (AbstractButton) itemEvent.getSource();
                System.out.println("Selection: " + btn.getActionCommand());
            }
        };
        for (String radioText : abcList) {
            JRadioButton radioButton = new JRadioButton(radioText);
            radioButton.setActionCommand(radioText);
            radioButton.addItemListener(il);
            radioPanel.add(radioButton);
            buttonGroup.add(radioButton);
        }

        JScrollPane scrollPane = new JScrollPane(radioPanel);
        scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollPane.getViewport().setPreferredSize(new Dimension(150, 200));

        setLayout(new BorderLayout());
        add(scrollPane);
    }

    private static void createAndShowGui() {
        RadioButtonScroller2 mainPanel = new RadioButtonScroller2();

        JFrame frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGui());
    }
}

兩個回答都讓我得到了答案,謝謝你們! 非常感謝 George Z. 和 HoverCraft Full of Eels 指出:

panel.setLayout(new FlowLayout()); 

不會工作。 George Z 明確建議使用:

panel.setLayout (new GridLayout(0, 1)); 

這對我有用。

雖然 George Z. 明確表示:

scrollPane.setSize(300, 525);
scrollPane.getVerticalScrollBar();

沒有完成任何事情,正是 Hovercraft Full Of Eels 提到的首選大小幫助我一路找到了答案(並找出我試圖用那兩行浪費的代碼完成的工作中出錯的地方)。

充滿鰻魚的氣墊船還幫助我了解了“打包”JFrame 的實際作用。 你們都提供了需要的東西,非常感謝。 這是一個簡短的工作答案:

import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.swing.Box;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;

public class RadioButtonScroller {
    private List<String> abcList = new ArrayList<>(Arrays.asList("Aa", "Bb", "Cc", "Dd", "Ee", "Ff", "Gg", "Hh", "Ii",
            "Jj", "Kk", "Ll", "Mm", "Nn", "Oo", "Pp", "Qq", "Rr", "Ss", "Tt", "Uu", "Vv", "Ww", "Xx", "Yy", "Zz"));
    private JRadioButton pickButton;
    private JFrame jframe = new JFrame("Select one:");
    private JScrollPane scrollPane;
    private JPanel panel = new JPanel();
    private Box vertBox;

    public RadioButtonScroller() {
        createUI();
    }

    public void setRadioButtons() {
        ButtonGroup group = new ButtonGroup();

        for (int i = 0; i < abcList.size(); i++) {
            String theseLetters = abcList.get(i);
            pickButton = new JRadioButton(theseLetters);

            group.add(pickButton);
            vertBox.add(pickButton);
        }
        jframe.pack();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private void createUI() {
        // center on screen
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
        jframe.setLocationRelativeTo(null);
        jframe.setLocation(dim.width / 3 - jframe.getSize().width / 3, dim.height / 4 - jframe.getSize().height / 4);

        vertBox = Box.createVerticalBox();
        jframe.setSize(300, 525);
        vertBox.setSize(300, 525);
        jframe.setVisible(true);

        panel.setLayout(new GridLayout(0, 1));
        jframe.add(panel);
        scrollPane = new JScrollPane(vertBox);
        scrollPane.setPreferredSize(new Dimension(300, 525));
        panel.add(scrollPane);

        setRadioButtons();
    }

    public static void main(String[] args) {
        RadioButtonScroller radioButtonScroller = new RadioButtonScroller();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM