首页 > 解决方案 > 使用java筛选

问题描述

我的朋友给了我一道关于素数的练习题。数字 1 到 n 需要在新窗口中显示。我也不知道如何使用从 panel1 到 panel2 的输入。我对 GUI 很陌生,因为几年前我学习 Java 时还没有去过那里。希望你能帮忙!

因为我真的不知道从哪里开始,所以我没有对 GUI 做太多事情,但是我看过 youtube 视频,并浏览了许多关于如何从 GUI 开始的网站。这是我所做的:

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

public class sieve
{
    private JPanel contentPane;
    private MyPanel input;
    private MyPanel2 sieve;

    private void displayGUI()
    {
        JFrame frame = new JFrame("Input");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setBorder(
        BorderFactory.createEmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new CardLayout());
        input = new MyPanel(contentPane);
        sieve = new MyPanel2();
        contentPane.add(input, "Input"); 
        contentPane.add(sieve, "Sieve of Erasthoneses");
        frame.setContentPane(contentPane);
        frame.pack();   
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String... args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new CardLayoutExample().displayGUI();
            }
        });
    }
}

class MyPanel extends JPanel {

    private JTextField text;
    private JLabel label1;
    private JButton OK;
    private JButton cancel;
    private JPanel contentPane;

    public MyPanel(JPanel panel) {

        contentPane = panel;

        label1 = new JLabel ("Enter a number from 1 to n:");
        text = new JTextField(1000);
        OK = new JButton ("OK");
        cancel = new JButton ("Cancel");

        setPreferredSize (new Dimension (500, 250));
        setLayout (null);

        text.setBounds (145, 50, 60, 25);
        OK.setBounds (450, 30, 150, 50);
        cancel.setBounds (250, 30, 150, 50);
        OK.setSize(315, 25);
        OK.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                CardLayout cardLayout = (CardLayout) contentPane.getLayout();
                cardLayout.next(contentPane);
            }
        });
        add (text);
        add (label1);
        add (OK);
        add (cancel);               
    }
}

class MyPanel2 extends JPanel {
    private JFrame frame;
    private JLabel label;
    JLabel label1;

    public MyPanel2() 
    {
      frame = new JFrame("Sieve of Eratosthenes");
      label = new JLabel("The Prime numbers from 2 to " + num + " are");
      num1 = num;
      boolean[] bool = new boolean[num1];  
   
      for (int i = 0; i < bool.length; i++) 
      {  
         bool[i] = true;  
      }  
      for (int i = 2; i < Math.sqrt(num1); i++) 
      {  
         if(bool[i] == true) 
         {  
            for(int j = (i*i); j < num1; j = j+i) 
            {  
               bool[j] = false;  
            }  
         }  
      }

      for (int i = 2; i< bool.length; i++) 
      {  
         if(bool[i]==true) 
         {  
           label1 = new JLabel(" " + label[i]);
         }  
      }  
   }  
}  

谢谢你的帮助!

标签: javaswing

解决方案


您的代码有很多编译错误。

Oracle 有一个有用的教程,使用 JFC/Swing 创建 GUI。跳过 Netbeans 部分。查看所有其他部分。

我重做了你的两个JPanels。创建 Swing 应用程序时,首先创建 GUI。创建 GUI 后,填写要显示的值。

我创建了以下 GUI。这是输入JPanel

输入面板

这是筛子JPanel

筛板

我使用Swing 布局管理器来创建这两个JPanels. 使用空布局和绝对定位会导致很多问题。

我创建了 sieve JPanel,然后用值填充它。你可以在源代码中看到我是如何做到的。

这是完整的可运行代码。我将课程设为内部课程。

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class Eratosthenes {
    
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Eratosthenes().displayGUI();
            }
        });
    }
    
    private CardLayout cardLayout;
    
    private JFrame frame;
    
    private JPanel contentPane;
    
    private InputPanel inputPanel;
    private SievePanel sievePanel;
    
    private void displayGUI() {
        frame = new JFrame("Input");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        contentPane = new JPanel();
        contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        cardLayout = new CardLayout();
        contentPane.setLayout(cardLayout);
        inputPanel = new InputPanel();
        sievePanel = new SievePanel();
        contentPane.add(inputPanel.getPanel(), "Input");
        contentPane.add(sievePanel.getPanel(), "Sieve");
        frame.setContentPane(contentPane);
        
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }
    
    public void cancelAction() {
        frame.dispose();
        System.exit(0);
    }
    
    public class InputPanel {
        
        private JPanel panel;
        
        private JTextField textField;

        public InputPanel() {
            this.panel = createMainPanel();
        }
        
        private JPanel createMainPanel() {
            JPanel panel = new JPanel(new BorderLayout());
            
            JPanel entryPanel = new JPanel(new FlowLayout());
            entryPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));

            JLabel label = new JLabel("Enter a number from 1 to n:");
            entryPanel.add(label);
            
            textField = new JTextField(10);
            entryPanel.add(textField);
            
            panel.add(entryPanel, BorderLayout.BEFORE_FIRST_LINE);
            
            JPanel buttonPanel = new JPanel(new FlowLayout());
            entryPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            
            JButton okButton = new JButton("OK");
            buttonPanel.add(okButton);
            okButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    int inputNumber = valueOf(textField.getText().trim());
                    if (inputNumber < 2) {
                        return;
                    }
                    sievePanel.updatePrimeLabel(inputNumber);
                    sievePanel.updatePrimeNumbers(inputNumber);
                    cardLayout.show(contentPane, "Sieve");
                }
                
                private int valueOf(String number) {
                    try {
                        return Integer.valueOf(number);
                    } catch (NumberFormatException e) {
                        return -1;
                    }
                }
            });
            
            JButton cancelButton = new JButton("Cancel");
            buttonPanel.add(cancelButton);
            cancelButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    cancelAction();
                }
            });
            
            okButton.setPreferredSize(cancelButton.getPreferredSize());
            
            panel.add(buttonPanel, BorderLayout.AFTER_LAST_LINE);
            
            return panel;
        }

        public JPanel getPanel() {
            return panel;
        }
        
    }
    
    public class SievePanel {
        
        private JLabel primeLabel;
        
        private JList<Integer> primeNumbersList;
        
        private JPanel panel;
        
        public SievePanel() {
            this.panel = createMainPanel();
        }
        
        private JPanel createMainPanel() {
            JPanel panel = new JPanel(new BorderLayout());
            panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
            Font titlefont = panel.getFont().deriveFont(Font.BOLD, 24f);
            
            JPanel textPanel = new JPanel(new BorderLayout());
            
            JLabel titleLabel = new JLabel("Sieve of Eratosthenes");
            titleLabel.setFont(titlefont);
            titleLabel.setHorizontalAlignment(JLabel.CENTER);
            textPanel.add(titleLabel, BorderLayout.BEFORE_FIRST_LINE);
            
            primeLabel = new JLabel(" ");
            primeLabel.setHorizontalAlignment(JLabel.CENTER);
            textPanel.add(primeLabel, BorderLayout.AFTER_LAST_LINE);
            
            panel.add(textPanel, BorderLayout.BEFORE_FIRST_LINE);
            
            primeNumbersList = new JList<>();
            JScrollPane scrollPane = new JScrollPane(primeNumbersList);
            panel.add(scrollPane, BorderLayout.CENTER);
            
            JButton button = new JButton("Return");
            panel.add(button, BorderLayout.AFTER_LAST_LINE);
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent event) {
                    cardLayout.show(contentPane, "Input");
                }
            });
            
            return panel;
        }
        
        public void updatePrimeLabel(int inputNumber) {
            primeLabel.setText("The prime numbers from 2 to " + 
                    inputNumber + " are:");
        }
        
        public void updatePrimeNumbers(int inputNumber) {
            DefaultListModel<Integer> primeNumbers = 
                    new DefaultListModel<>();
            boolean[] bool = new boolean[inputNumber];

            for (int i = 0; i < bool.length; i++) {
                bool[i] = true;
            }
            for (int i = 2; i < Math.sqrt(inputNumber); i++) {
                if (bool[i] == true) {
                    for (int j = (i * i); j < inputNumber; j = j + i) {
                        bool[j] = false;
                    }
                }
            }

            for (int i = 2; i < bool.length; i++) {
                if (bool[i] == true) {
                    primeNumbers.addElement(i);
                }
            }
            
            primeNumbersList.setModel(primeNumbers);
        }

        public JPanel getPanel() {
            return panel;
        }
        
    }

}

推荐阅读