【问题标题】:Java - Grocery list as a JFrameJava - 杂货清单作为 JFrame
【发布时间】:2021-09-17 16:15:37
【问题描述】:

我想在 Java 中创建一个购物清单作为 JFrame。我有一个JTextField“输入”,您可以在其中输入要添加的内容,输入将保存在String“eingabe”中,然后是JButton“按钮”,您可以在其中添加您想要的内容添加。

如果你按下JButton“按钮”,它会创建一个JLabel“标签”(带有字符串“eingabe”的值)、一个JCheckBox“盒子”和一个JButton“button2”应该是什么项目的删除按钮。

所以如果你按下JButton“button2”它应该删除添加的项目(JLabel“label”)、JCheckBox“box”和JButton“button2”。

一切正常,但如果我按下按钮 2,它只会删除最后添加的项目。我该怎么做才能将每​​个删除按钮链接到相关的标签、框和按钮本身?

也许使用列表或数组或类似的东西。如果是,你能解释一下如何实现它的逻辑吗?

我希望你能明白我想问什么。

这是我的代码:

import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Layer  extends JFrame implements ActionListener, KeyListener{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    
    // Alle Konstruktoren,Variablen, Attribute oder so
    private JButton button,button2;
    private JTextField input;
    private JLabel label;
    private String eingabe;
    private JPanel panel;
    private JCheckBox box;
    
    
    public void Fenster() {
                
        // Wenn das X rechts oben gedrückt wird, wird das Fenster geschlossen
        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        
        // Titel und Größe des JFrame werden gesetzt
        this.setTitle("Einkaufsliste");
        this.setSize(300,700);
        this.setResizable(false);
        
        // Neues Objekt von JTextField wird erstellt und alles wird direkt markiert und die Größe wird gesetzt 
        input = new JTextField("Hier eingeben");
        input.selectAll();
        input.setMaximumSize(new Dimension(200,20));
        
        
        // Neues Objekt von JTextField wird erstellt, zentral ausgerichtet und ein ActionListener hinzugefügt
        button = new JButton("Hinzufügen");
        button.setAlignmentX(CENTER_ALIGNMENT);
        button.addActionListener(this);
        
        // Neues Objekt von JPanel wird erstellt und das BoxLayout hinzugefügt 
        panel = new JPanel();
        
        panel.setLayout(new javax.swing.BoxLayout(panel, javax.swing.BoxLayout.Y_AXIS));
        
        // Das JTextField "input" und dem JButton "button" werden dem JPanel "panel" hinzugefügt
        panel.add(Box.createRigidArea(new Dimension(0,10)));
        panel.add(input);
        panel.add(Box.createRigidArea(new Dimension(0,10)));
        panel.add(button);
        panel.add(Box.createRigidArea(new Dimension(0,10)));
        // Der soll einfach eine Trennlinie erstellen 
        panel.add(new JSeparator(SwingConstants.HORIZONTAL));
        panel.add(Box.createRigidArea(new Dimension(0,10)));
        
        
        //Dem JFrame "this" wird das JPanel "panel" hinzugefügt
        this.add(panel);
        
        // Dem JButton "button" wird ein KeyListener hinzugefügt
        button.addKeyListener((KeyListener) this);
        
    }
    
    public void keyPressed(KeyEvent ke) {
        if(ke.getKeyCode() == KeyEvent.VK_ENTER) {
            button.doClick();
        }
    }

    @SuppressWarnings("deprecation")
    public void actionPerformed(ActionEvent e) {
        //Wenn button gedrückt wird passiert das
        if(e.getSource() == this.button) {
            
            
            // neues Objekt von JLabel wird erstellt und panel hinzugefügt
            label = new JLabel();
            panel.add(label);
            
            // neues Objekt von JButton wird erstellt und ActionListener hinzugefügt
            button2 = new JButton("Löschen");
            button2.addActionListener(this);
            
            // String eingabe bekommt den Wert der im TextField input drinne ist
            eingabe = input.getText();
            
            // In Label wird der Wert des Strings eingabe gegeben und zentral ausgerichtet
            label.setText(eingabe);
            label.setAlignmentX(CENTER_ALIGNMENT);
            
            // neues Objekt von JCheckBox wird erstellt und panel hinzugefügt
            box = new JCheckBox();
            panel.add(box);
            
            // label,box und button2 werden zentral ausgerichtet
            label.setAlignmentX(Component.CENTER_ALIGNMENT);
            box.setAlignmentX(Component.CENTER_ALIGNMENT);
            button2.setAlignmentX(Component.CENTER_ALIGNMENT);
            
            // button2 wird dem Panel hinzugefügt
            panel.add(button2);
            
        }
        //Wenn button2 gedrückt wird passiert das
        if (e.getSource() == button2){          
                label.hide();
                box.hide();
                button2.hide();
            }   
        }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
        
    }
    
}

【问题讨论】:

  • JList 可能是您正在寻找的。见How to Use Lists。然后,您可以将您的项目添加到此列表中以显示它们。链接的教程向您展示了如何在列表中添加和删除项目。

标签: java swing


【解决方案1】:

只有最新组件被删除的问题,是因为有一个JLabel/JButton/JCheckBox的引用,当点击添加按钮时它会更新。

因此,在删除时,只有这些最新更新的引用会从 UI 中清除。

您可以将 JLabel/JButton 添加到新的 JPanel 中,而不是添加单个元素,然后单击 Delete 按钮,只需检查Component.getParent,点击了,如本演示程序所示。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class AddDeleteFrame {
    
    private JFrame frame;
    private int counter;
    
    private void displayGUI () {
        counter = 0;
        frame = new JFrame ( "Add Delete JFrame" );
        frame.setDefaultCloseOperation ( JFrame.DISPOSE_ON_CLOSE );
        
        final JPanel contentPane = new JPanel ( new GridLayout ( 0, 1, 5, 5 ) ) {
            @Override
            public Dimension getPreferredSize () {
                return new Dimension ( 600, 400 );
            }
        };
        JButton button = new JButton ( "Add" );     
        button.addActionListener ( new ActionListener () {
            @Override
            public void actionPerformed ( ActionEvent ae ) {
                JPanel panel = new JPanel ();
                ++counter;
                JLabel label = new JLabel ( "Counter: " + counter );
                final JButton b = new JButton ( "Delete" );
                b.addActionListener ( new ActionListener () {
                    @Override
                    public void actionPerformed ( ActionEvent ae ) {
                        contentPane.remove ( b.getParent () );
                        frame.revalidate ();
                        frame.repaint ();
                    }
                } );
                
                panel.add ( label );
                panel.add ( b );
                contentPane.add ( panel );
                frame.revalidate ();
                frame.repaint ();
            }
        } );
        
        contentPane.add ( button );
        
        frame.setContentPane ( contentPane );
        frame.pack ();
        frame.setLocationByPlatform ( true );
        frame.setVisible ( true );
    }
    
    public static void main ( String [] args ) {
        EventQueue.invokeLater ( new Runnable () {
            @Override
            public void run () {
                new AddDeleteFrame ().displayGUI ();
            }
        } );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多