有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在做一个基于医学商店的学校项目,我想在我使用的所有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();
            }
        });
    }
}

有什么方法可以将滚动窗格添加到列表、列表2和列表3中吗?我真的不想设置另一种布局类型,因为我不习惯它们,当我开始做这个GUI时,我使用了绝对布局,但我遇到了一些问题,我决定手工编写所有代码


共 (2) 个答案

  1. # 1 楼答案

    感谢您提供示例代码/最小工作示例。(一句话——如果没有发现Plante.txt,就会抛出异常。您可以改进代码来处理这种行为,例如,向用户发出警告或消息。)

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

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

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

  2. # 2 楼答案

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

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

    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!!!