Bilah Gulir Vertikal untuk Tombol Radio

Saya seorang programmer Java yang sangat baru.

Saya mencoba membuat daftar vertikal tombol radio dengan bilah gulir. Kode saya tidak menghasilkan jendela dengan ukuran yang ditentukan, dan bilah gulir juga tidak muncul.

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();
    }
}

Saya telah berhasil menggunakan JFrame dengan Vbox sebelumnya, namun penambahan JPanel & JScrollPane membuat saya bingung.

(Saya tidak dapat menggunakan JavaFX, karena beberapa masalah kompatibilitas. Harus dalam proses.)

Terimakasih banyak.


person lep    schedule 09.12.2019    source sumber


Jawaban (3)


Ini adalah tata letak yang Anda gunakan di panel.setLayout(new FlowLayout());. Tata letak alur "tidak berfungsi dengan baik" dengan JScrollPane. Anda dapat mengubah tata letak dan Anda akan mendapatkan panel gulir yang fungsional tanpa harus melakukan hal tambahan. (Untuk membuat tata letak aliran berfungsi dengan JScrollPane, Anda harus menyelidiki lebih lanjut, mungkin dengan pendengar komponen, dll.)

Dalam kasus Anda, saya akan menggunakan GridLayout dengan 1 kolom, baris tak terbatas:

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

Atau BoxLayout dengan sumbu y:

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

Selain itu, baris-baris ini tidak berperan:

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

Ukuran Scrollpane akan dihitung dari container induk, yaitu panel konten JFrame.

person George Z.    schedule 09.12.2019

Banyak masalah tata letak di sini

  1. sebagian besar manajer tata letak tidak memperhatikan ukuran komponen, melainkan ukuran yang diinginkan.
  2. Dan ukuran JScrollPane dikontrol oleh ukuran viewport yang diinginkan.
  3. FlowLayout sangat mendasar dan tidak kenal ampun dan sering kali tidak berfungsi dengan baik dengan tata letak kombinasi yang rumit.
  4. Jangan menambahkan komponen setelah mengemas JFrame Anda, melainkan sebelumnya. Jika tidak, komponen dan pengelola tata letak tidak akan menyesuaikan ukurannya.

e.g.,

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());
    }
}
person Hovercraft Full Of Eels    schedule 09.12.2019
comment
Apa itu area pandang? - person lep; 10.12.2019
comment
@lep: setiap JScrollPane memiliki viewport sebagai komponen pertama dan utamanya. Komponen yang ditampilkan di JScrollPane disimpan di viewport sebagai tampilannya. Hal ini dijelaskan dengan baik dengan gambar di JScrollPane Tutorial. Coba lihat tautan ini. - person Hovercraft Full Of Eels; 10.12.2019

Kedua tanggapan membawa saya ke jawaban saya, terima kasih keduanya! Terima kasih banyak kepada George Z. dan HoverCraft Full of Eels karena telah menunjukkan bahwa:

panel.setLayout(new FlowLayout()); 

TIDAK akan berhasil. Itu adalah saran yang jelas dari George Z untuk menggunakan:

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

itu berhasil untuk saya.

Sementara George Z. menegaskan bahwa:

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

tidak mencapai apa pun, penyebutan ukuran pilihan Hovercraft Full Of Eels-lah yang membantu saya mendapatkan jawabannya (dan mencari tahu di mana kesalahan saya dalam apa yang ingin saya capai dengan itu 2 baris kode yang terbuang).

Hovercraft Full of Eels juga membantu saya melihat apa sebenarnya fungsi "mengemas" JFrame. Anda berdua memberikan apa yang dibutuhkan, terima kasih banyak. Inilah jawaban singkat yang berhasil:

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();
    }
}
person lep    schedule 09.12.2019