Java 是否有任何方法可以将滚动窗格添加到jlist,并将其添加到具有空布局的面板上?

Java 是否有任何方法可以将滚动窗格添加到jlist,并将其添加到具有空布局的面板上?,java,swing,Java,Swing,我正在做一个基于医学商店的学校项目,我想在我使用的所有3个列表中添加一个滚动窗格 package Interfata; import java.awt.Color; import java.awt.GridBagLayout; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.io.BufferedRea

我正在做一个基于医学商店的学校项目,我想在我使用的所有3个列表中添加一个滚动窗格

package Interfata;

import java.awt.Color;
import java.awt.GridBagLayout;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing. * ;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.SwingUtilities;

public class Home extends JFrame {
    JPanel panelHome;
    static String[] listaplante = new String[10];
    static String[] listacantitati = new String[10];
    static String[] listapreturi = new String[10];
    static int kPlante = 0,
    kCantitati = 0,
    kPreturi = 0;
    JButton butonCumpara,
    butonAdauga;
    JTextField denumireField,
    pretField,
    cantitateField,
    cantitateDoritaField;

    public JPanel createHomeContentPane() {

        //Creez un panel pe care sa pun toate campurile.
        panelHome = new JPanel();
        panelHome.setLayout(null);
        panelHome.setBackground(new java.awt.Color(204, 204, 255));
        panelHome.setBorder(javax.swing.BorderFactory.createTitledBorder("Home"));

        //Creez lista cu plante
        DefaultListModel < String > listaPlante = new DefaultListModel < >();
        JList < String > list = new JList < >(citirePlante());
        list.setBounds(50, 75, 75, 100);
        list.setSelectionBackground(Color.ORANGE);
        panelHome.add(list);

        //Creez lista cu cantitatile fiecarei plante
        DefaultListModel < String > listaCantitati = new DefaultListModel < >();
        JList < String > list2 = new JList < >(citireCantitati());
        list2.setBounds(150, 75, 75, 100);
        list2.setSelectionBackground(Color.YELLOW);
        panelHome.add(list2);

        //Creez lista cu preturile fiecarei plante
        DefaultListModel < String > listaPreturi = new DefaultListModel < >();
        JList < String > list3 = new JList < >(citirePreturi());
        list3.setBounds(250, 75, 75, 100);
        list3.setSelectionBackground(Color.GREEN);
        panelHome.add(list3);

        //Creez titlurile pt fiecare lista
        JLabel denumireLabel = new JLabel("Denumire:");
        denumireLabel.setBounds(50, 55, 70, 20);
        panelHome.add(denumireLabel);

        JLabel cantitatiLabel = new JLabel("Cantitati:");
        cantitatiLabel.setBounds(150, 55, 70, 20);
        panelHome.add(cantitatiLabel);

        JLabel preturiLabel = new JLabel("Preturi:");
        preturiLabel.setBounds(250, 55, 70, 20);
        panelHome.add(preturiLabel);

        //Creez un camp pt a adauga cantitatea dorita care urmeaza a fi cumparata
        //cantitateDoritaField
        cantitateDoritaField = new JTextField();
        cantitateDoritaField.setBounds(80, 200, 100, 20);
        cantitateDoritaField.setHorizontalAlignment(JTextField.CENTER);

        //placeholder pt cantitateField
        final String placeholderCantitateDorita = "Cantitatea dorita";
        cantitateDoritaField.setText(placeholderCantitateDorita);
        cantitateDoritaField.addFocusListener(new FocusListener() {
            private boolean showingPlaceholder = true;
            public void focusGained(FocusEvent e) {
                if (showingPlaceholder) {
                    showingPlaceholder = false;
                    cantitateDoritaField.setText("");
                }
            }
            public void focusLost(FocusEvent arg0) {
                if (cantitateDoritaField.getText().isEmpty()) {
                    cantitateDoritaField.setText(placeholderCantitateDorita);
                    showingPlaceholder = true;
                }
            }
        });
        panelHome.add(cantitateDoritaField);

        //Butonul de cumparare
        butonCumpara = new JButton("Cumpara");
        butonCumpara.setLocation(180, 200);
        butonCumpara.setSize(100, 20);
        butonCumpara.addActionListener(new ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                String plantaselectata = list.getSelectedValue();
                int indexplanta = list.getSelectedIndex();
                String cantitateselectata = list2.getSelectedValue();
                int indexcantitate = list2.getSelectedIndex();
                String pretselectat = list3.getSelectedValue();
                int indexpret = list3.getSelectedIndex();
                String cantitatedorita = cantitateDoritaField.getText();

                int valCantitate = Integer.valueOf(cantitateselectata);
                int valCantitateDorita = Integer.valueOf(cantitatedorita);
                int valPret = Integer.valueOf(pretselectat);

                if (indexplanta == indexcantitate && indexplanta == indexpret) {
                    if (valCantitateDorita <= valCantitate) {
                        try {
                            afisPlantaCumparata(plantaselectata, valCantitateDorita);
                        } catch(IOException ex) {
                            Logger.getLogger(Home.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        int a = valCantitate - valCantitateDorita;
                        String b = Integer.toString(a);
                        listacantitati[indexcantitate] = b;
                        panelHome.setVisible(false);
                        panelHome.setVisible(true);
                    }
                    else {
                        JFrame rootPane = null;
                        JOptionPane.showMessageDialog(rootPane, "Cantitatea nu esti disponibila", "Eroare de cumparare", JOptionPane.WARNING_MESSAGE);
                    }
                }
                else {
                    JFrame rootPane = null;
                    JOptionPane.showMessageDialog(rootPane, "Planta, cantitate si pretul nu sunt din aceeasi categorie", "Eroare de cumparare", JOptionPane.WARNING_MESSAGE);
                }

            }
        });
        panelHome.add(butonCumpara);

        //Cumpurile denumire cantitate si pret pt adaugarea plantei
        //denumireField
        denumireField = new JTextField();
        denumireField.setBounds(80, 240, 100, 20);
        denumireField.setHorizontalAlignment(JTextField.CENTER);

        //placeholder pt denumireField
        final String placeholderDenumire = "Denumire";
        denumireField.setText(placeholderDenumire);
        denumireField.addFocusListener(new FocusListener() {
            private boolean showingPlaceholder = true;
            public void focusGained(FocusEvent e) {
                if (showingPlaceholder) {
                    showingPlaceholder = false;
                    denumireField.setText("");
                }
            }
            public void focusLost(FocusEvent arg0) {
                if (denumireField.getText().isEmpty()) {
                    denumireField.setText(placeholderDenumire);
                    showingPlaceholder = true;
                }
            }
        });
        panelHome.add(denumireField);

        //cantitateField
        cantitateField = new JTextField();
        cantitateField.setBounds(80, 260, 100, 20);
        cantitateField.setHorizontalAlignment(JTextField.CENTER);

        //placeholder pt cantitateField
        final String placeholderCantitate = "Cantitatea";
        cantitateField.setText(placeholderCantitate);
        cantitateField.addFocusListener(new FocusListener() {
            private boolean showingPlaceholder = true;
            public void focusGained(FocusEvent e) {
                if (showingPlaceholder) {
                    showingPlaceholder = false;
                    cantitateField.setText("");
                }
            }
            public void focusLost(FocusEvent arg0) {
                if (cantitateField.getText().isEmpty()) {
                    cantitateField.setText(placeholderCantitate);
                    showingPlaceholder = true;
                }
            }
        });
        panelHome.add(cantitateField);

        //pretField
        pretField = new JTextField();
        pretField.setBounds(80, 280, 100, 20);
        pretField.setHorizontalAlignment(JTextField.CENTER);

        //placeholder pt pretField
        final String placeholderPret = "Pret";
        pretField.setText(placeholderPret);
        pretField.addFocusListener(new FocusListener() {
            private boolean showingPlaceholder = true;
            public void focusGained(FocusEvent e) {
                if (showingPlaceholder) {
                    showingPlaceholder = false;
                    pretField.setText("");
                }
            }
            public void focusLost(FocusEvent arg0) {
                if (pretField.getText().isEmpty()) {
                    pretField.setText(placeholderPret);
                    showingPlaceholder = true;
                }
            }
        });
        panelHome.add(pretField);

        //Butonul de adaugare a unei plantei noi
        butonAdauga = new JButton("Adauga");
        butonAdauga.setLocation(180, 260);
        butonAdauga.setSize(100, 20);
        butonAdauga.addActionListener(new ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                String denumireNou = denumireField.getText();
                String cantitateNou = cantitateField.getText();
                String pretNou = pretField.getText();

                listaplante[kPlante++] = denumireNou;
                listacantitati[kCantitati++] = cantitateNou;
                listapreturi[kPreturi++] = pretNou;
                panelHome.setVisible(false);
                panelHome.setVisible(true);
            }
        });
        panelHome.add(butonAdauga);

        //Returnez panelul
        panelHome.setOpaque(true);
        return panelHome;
    }

    public static String[] citirePlante() {
        BufferedReader objReader = null;
        try {
            String strCurrentLine;
            objReader = new BufferedReader(new FileReader("Plante.txt"));
            while ((strCurrentLine = objReader.readLine()) != null) {
                listaplante[kPlante] = strCurrentLine;
                kPlante++;
            }
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (objReader != null) objReader.close();
            } catch(IOException ex) {
                ex.printStackTrace();
            }
        }
        return listaplante;
    }

    public static String[] citireCantitati() {
        BufferedReader objReader = null;
        try {
            String strCurrentLine;
            objReader = new BufferedReader(new FileReader("Cantitati.txt"));
            while ((strCurrentLine = objReader.readLine()) != null) {
                listacantitati[kCantitati] = strCurrentLine;
                kCantitati++;
            }
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (objReader != null) objReader.close();
            } catch(IOException ex) {
                ex.printStackTrace();
            }
        }
        return listacantitati;
    }

    public static String[] citirePreturi() {
        BufferedReader objReader = null;
        try {
            String strCurrentLine;
            objReader = new BufferedReader(new FileReader("Preturi.txt"));
            while ((strCurrentLine = objReader.readLine()) != null) {
                listapreturi[kPreturi] = strCurrentLine;
                kPreturi++;
            }
        } catch(IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (objReader != null) objReader.close();
            } catch(IOException ex) {
                ex.printStackTrace();
            }
        }
        return listapreturi;
    }

    public static void afisPlantaCumparata(String p, int c) throws IOException {
        FileWriter writer = new FileWriter("PlanteVandute.txt", true);
        try (

        BufferedWriter bw = new BufferedWriter(writer)) {

            bw.write(p + " " + c + "\n");

        } catch(IOException e) {
            System.err.format("IOException: %s%n", e);
        }
    }

    private static void Home() {

        JFrame frameHome = new JFrame("PLAFAR * Calinescu George-Catalin * 221");

        //Creez panelul peste frame si il stilizez
        Home home = new Home();
        frameHome.setContentPane(home.createHomeContentPane());
        frameHome.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frameHome.setSize(400, 350);
        frameHome.setVisible(true);
    }

    public static void main(String[] args) {
        //Creez GUI si il afisez pe ecran
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                Home();
            }
        });
    }
}
package-interdata;
导入java.awt.Color;
导入java.awt.GridBagLayout;
导入java.awt.event.ActionListener;
导入java.awt.event.FocusEvent;
导入java.awt.event.FocusListener;
导入java.io.BufferedReader;
导入java.io.BufferedWriter;
导入java.io.FileReader;
导入java.io.FileWriter;
导入java.io.IOException;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.*;
导入javax.swing.DefaultListModel;
导入javax.swing.JFrame;
导入javax.swing.JList;
导入javax.swing.SwingUtilities;
公共类家庭扩展JFrame{
JPanel panelHome;
静态字符串[]ListaPlane=新字符串[10];
静态字符串[]ListaAntitati=新字符串[10];
静态字符串[]listapreturi=新字符串[10];
静态int kPlante=0,
KCantati=0,
kPreturi=0;
朱布顿·布顿坎帕拉,
布托纳道加;
JTextField denumireField,
普雷特菲尔德,
坎蒂特菲尔德,
坎蒂塔菲尔德;
公共JPanel createHomeContentPane(){
//Creez un panel pe care sa pun toate露营酒店。
panelHome=新的JPanel();
panelHome.setLayout(null);
setBackground(新的java.awt.Color(204204255));
setboorder(javax.swing.BorderFactory.createTitledBorder(“Home”));
//克里兹利斯塔工厂
DefaultListModelListaPlane=新的DefaultListModel<>();
JListlist=newjlist<>(citirePlante());
列表.立根(50,75,75,100);
list.setSelectionBackground(橙色);
panelHome.add(列表);
//克里兹·利斯塔cu Cantitile fiecarei植物园
DefaultListModelListaAntitati=新的DefaultListModel<>();
JListlist2=新JList<>(citirecantati());
清单2.立根(150,75,75,100);
列表2.setSelectionBackground(颜色:黄色);
panelHome.add(列表2);
//克里兹·利斯塔·普雷图里勒·菲卡雷普兰特酒店
DefaultListModellistaPreturi=新的DefaultListModel<>();
JListlist3=新JList<>(citirePreturi());
清单3.挫折(250、75、75、100);
列表3.setSelectionBackground(颜色为绿色);
panelHome.add(列表3);
//克里兹提尔里尔pt菲卡雷利斯塔酒店
JLabel denumireLabel=新JLabel(“Denumire:”);
denumireLabel.挫折(50,55,70,20);
panelHome.add(denumireLabel);
JLabel-CantititLabel=新的JLabel(“Cantitit:”);
弯曲度.立根(150,55,70,20);
panelHome.add(标签);
JLabel preturiLabel=新的JLabel(“Preturi:”);
前庭标签.立根(250,55,70,20);
panelHome.add(preturiLabel);
//Creez联合国难民营是一个康蒂塔康蒂塔多丽塔护理中心
//坎蒂塔菲尔德酒店
cantitateDoritaField=新的JTextField();
坎蒂塔德多里塔菲尔德.立根(8020010020);
设置水平对齐(JTextField.CENTER);
//占位符pt cantitateField
最后一个字符串占位符cantitatedorita=“Cantitatea dorita”;
setText(占位符cantitatedorita);
addFocusListener(新FocusListener()){
私有布尔值showingPlaceholder=true;
获得公共无效焦点(焦点事件e){
如果(显示占位符){
showingPlaceholder=false;
cantitateDoritaField.setText(“”);
}
}
public void focusLost(FocusEvent arg0){
if(cantitateDoritaField.getText().isEmpty()){
setText(占位符cantitatedorita);
showingPlaceholder=true;
}
}
});
panelHome.add(cantitateDoritaField);
//康帕拉雷丁醇
butonCumpara=新的JButton(“Cumpara”);
butonCumpara.设置位置(180200);
butonCumpara.setSize(100,20);
butonCumpara.addActionListener(新ActionListener(){
public void actionPerformed(java.awt.event.ActionEvent evt){
字符串plantaselectata=list.getSelectedValue();
int indexplanta=list.getSelectedIndex();
字符串cantitateselectata=list2.getSelectedValue();
int indexcantate=list2.getSelectedIndex();
字符串pretselectat=list3.getSelectedValue();
int indexpret=list3.getSelectedIndex();
字符串cantitatedorita=cantitateDoritaField.getText();
int valCantitate=整数.valueOf(cantitateselectata);
int valCantitateDorita=Integer.valueOf(cantitatedorita);
int valPret=Integer.valueOf(pretselectat);
if(indexplanta==indexcantate&&indexplanta==indexpret){

if(valCantitateDorita感谢您提供示例代码/最小工作示例。(一句话-如果未发现
Plante.txt
,将引发异常。您可以改进代码以处理此行为,例如,向用户发出警告或消息。)

您可以将
JList
添加到
JScrollPane
中,如下所示:

// to ensure single selection in your list
someList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
JScrollPane scrollPane = new JScrollPane(someList);


然后,您必须将
scollPane
添加到
LayoutManager
或(在您的示例中)
JPanel

强烈建议使用普通布局管理器,因为布局管理器允许在调整窗口/面板大小时处理组件大小。它还为不同的和操作系统提供更好的支持

要使代码正常工作,您需要在列表周围安装滚动窗格

DefaultListModel<String> listaPlante = new DefaultListModel<>();
JList<String> list = new JList<>(citirePlante());
JScrollPane scroller = new JScrollPane(list);
scroller.setBounds(50,75, 75,100); // not list!!!
list.setSelectionBackground(Color.ORANGE);
panelHome.add(scroller); // not list!!!
DefaultListModel listaplant=newdefaultlistmodel();
JList列表=新的JList(c