为什么 JList 'cut' 或其他东西在我的 GUI 框架输出中?

Why is JList 'cut', or something, in my GUI frame output?

好的,所以我编写了一个程序,这是 GUI 输出...

GUI output

我试过调整它的大小,但没有骰子...不起作用。 jlist 'box' 仍然以某种方式被删除...请帮忙?

Resized Output

顺便说一句,如果需要的话,这是代码...

import java.awt.GridLayout;
import java.awt.BorderLayout;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemListener;
import java.awt.event.ItemEvent;

import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JRadioButton;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.ButtonGroup;
import javax.swing.JCheckBox;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Order extends JFrame{

JLabel title;
JLabel size;
JLabel top;
JRadioButton b1;
JRadioButton b2;
JRadioButton b3;
JCheckBox c1;
JCheckBox c2;
JCheckBox c3;
JButton process;
ButtonGroup group;
JPanel p1;
JPanel p2;
JPanel p3;
double total;
boolean cb1 = false;
boolean cb2 = false;
boolean cb3 = false;
boolean cheese = false;
boolean tomato = false;
boolean mushroom = false;
String toppings = "Add-on Toppings: ";
double length = 0;
boolean cf = false;
boolean tf = false;
boolean mf = false;
String sizeString;
String num;
String price = "Amount Due: ";
DefaultListModel tops;
double tprice;
String listData[] = new String [3];
JScrollPane pain;

public Order(){

    super ("");

    p1 = new JPanel();

    title = new JLabel("WELCOME TO HAUZ DINNERS");
    p1.add(title);

    add(p1, BorderLayout.NORTH);

    p2 = new JPanel();
    p2.setLayout(new GridLayout(4,2));

    size = new JLabel("Burger Size");
    p2.add(size);

    top = new JLabel("Each Add-on Toppings: .25");
    p2.add(top);

    b1 = new JRadioButton("Small: .50");
    p2.add(b1);

    b1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            total = 3.50;
            sizeString = "Burger Size: Small";
        }
    });

    c1 = new JCheckBox("Extra Cheese");
    p2.add(c1);

    c1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            if(c1.isSelected()){
                cheese = true;
            }
            else{
                cheese = false;
            }

            if(cheese == true){
                length++;
            }
            else{
                length--;
            }
        }
    });

    b2 = new JRadioButton("Medium: .50");
    p2.add(b2);

    b2.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            total = 4.50;
            sizeString = "Burger Size: Medium";
        }
    });

    c2 = new JCheckBox("Tomato");
    p2.add(c2);

    c2.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            if(c2.isSelected()){
                tomato = true;
            }
            else{
                tomato = false;
            }

            if(tomato == true){
                length++;
            }

            else{
                length--;
            }
        }
    });

    b3 = new JRadioButton("Large: .00");
    p2.add(b3);

    b3.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            total = 6.00;
            sizeString = "Burger Size: Large";
        }
    });

    c3 = new JCheckBox("Mushrooms");
    p2.add(c3);

    c3.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            if(c3.isSelected()){
                mushroom = true;
            }
            else{
                mushroom = false;
            }

            if(mushroom == true){
                length++;
            }

            else{
                length--;
            }
        }
    });

    group = new ButtonGroup();
    group.add(b1);
    group.add(b2);
    group.add(b3);

    add(p2, BorderLayout.CENTER);

    p3 = new JPanel();

    process = new JButton("Process Order");
    p3.add(process);

    process.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            if(cheese == true){
                cf = true;
                if((cf == true)&&(tf != true)&&(mf != true)){
                    toppings = toppings + "Extra Cheese";
                }
                else{
                    toppings = toppings + ", Extra Cheese";
                }
            }
            if(tomato == true){
                tf = true;
                if((cf != true)&&(tf == true)&&(mf != true)){
                    toppings = toppings + "Tomato";
                }
                else{
                    toppings = toppings + ", Tomato";
                }
            }
            if(mushroom == true){
                mf = true;
                if((cf != true)&&(tf != true)&&(mf == true)){
                    toppings = toppings + "Mushrooms";
                }
                else{
                    toppings = toppings + ", Mushrooms";
                }
            }

            tprice = 1.25 * length;

            total = total + tprice;
            num = Double.toString(total);

            price = price + "$" + num;

            listData [0] = sizeString;
            listData [1] = toppings;
            listData [2] = price;

        }
    });
    JList<String> list = new JList<>(listData);
    list.setSelectedIndex(0);
    pain = new JScrollPane(list);

    p3.add(list);

    add(p3, BorderLayout.SOUTH);

}

public static void main(String[]args){

    Order frame = new Order();
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(350,220);
    frame.setVisible(true);

}

}

首先,将 p3 的布局管理器更改为更实用的东西,而不是默认的 FlowLayout 管理器...

p3 = new JPanel();
p3.setLayout(new BorderLayout());
process = new JButton("Process Order");
p3.add(process, BorderLayout.NORTH);

接下来,确保将 JScrollPane 添加到容器中,而不仅仅是 JList

JList<String> list = new JList<>();
list.setSelectedIndex(0);
list.setVisibleRowCount(3);
pain = new JScrollPane(list);

p3.add(pain, BorderLayout.SOUTH);

add(p3, BorderLayout.SOUTH);

现在,注意事项。我添加了 list.setVisibleRowCount(3);,它给了 JList 一些大小调整提示。我还在 JList 构造时从 JList 中删除了 listData ,这是因为列表是数组是空的并且它 JList 正在使用它的内容来确定 "preferred" 行大小,这导致非常小 JList

这最终会产生类似...

现在,当您单击 Process Order 时,您需要创建一个 ListModel 并将其应用到您的 JList,这将需要使 JList 可用到按钮的 ActionListener,可能是通过将其设为实例字段