当前位置: 首页 > 知识库问答 >
问题:

使用Java Swing显示eratosthenes筛

双恩
2023-03-14

null

null

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]);
         }  
      }  
   }  
}  

谢谢你的帮助!

共有1个答案

狄德泽
2023-03-14

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

Oracle有一个很有帮助的教程,使用JFC/Swing创建GUI。跳过Netbeans部分。复习所有其他部分。

我重新修改了您的两个jpanels。创建Swing应用程序时,首先创建GUI。创建GUI后,填写要显示的值。

null

null

我使用Swing布局管理器创建了两个jpanels。使用空布局和绝对定位会导致许多问题。

我创建了筛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;
        }
        
    }

}
 类似资料:
  • 我正在开发一个swing应用程序(让我们忽略为什么)。 我需要做一个自定义设计的滚动条。到目前为止还不错,我实现了我的ScrollBarUI后代-我有自定义按钮,自定义拇指,自定义轨道...除了按钮周围的区域-我在那里添加了一些填充,我想把我所有的滚动条包装成一个圆角矩形。 由于我在ScrollBarUI中没有找到这样做的方法,我决定扩展JScrollPane(扩展那里使用的ScrollBar,这

  • 我很好奇,在放置组件时,如何使用miglaway在网格上均匀分布组件: 例如,如果我在一个按钮组中放置四个JRadioButton以跨越3行2列(2,3),然后放置三个JButton,则分布的权重是不相等的,我最终会得到以下结果: 如图所示,A和B的大小相同,C保留剩余的空间:我希望A、B、C在垂直方向上等于三分之一。 如果这在GridBagLayout中是可能的,我也可以利用它,但是我在任何一种

  • 问题内容: 我已经可以存储所有32位质数,并且 我想用它们来生成一些64位质数 。即使对逻辑和编译进行了优化,使用试验划分也太慢了。 我正在尝试修改Eratosthenes的筛网以使用预定义列表,如下所示: 在数组A中从2到4294967291 在数组B中从2 ^ 32到X inc减1 找到C,它是当前素数的第一个倍数。 从C标记开始并以当前素数跳至X。 转到1。 问题是使用模数查找素数的第3步,

  • 我的一个视图返回了一个字符串,如下所示: 我试图用刀片显示它: 但是,输出是原始字符串,而不是呈现的超文本标记语言。如何在Laravel中使用Blade显示超文本标记语言? PS.PHP正确显示HTML。

  • 问题内容: 我正在从数据库中检索Blob图像,并且希望能够使用JavaScript查看该图像。以下代码在页面上产生一个损坏的图像图标: 其中包含所有必需的代码,包括blob。完成的代码应正确显示图像。 问题答案: 问题是我有十六进制数据,需要先进行十六进制数据转换,然后才能进行base64编码。 在PHP中:

  • 问题内容: 我正在尝试通过AJAX调用显示PDF(在服务器端创建并作为网络流传递给客户端)。我的代码如下: “ inputxml”包含用于服务器创建PDF的输入参数。和成功函数中包含PDF流的“数据”。是否可以在AJAX调用成功功能内的浏览器中打开PDF文件,而无需进行任何页面提交?在服务器端,PDF也不是物理生成的。非常感谢您的帮助。 问题答案: 为什么要通过AJAX加载它?为什么不将其加载到需