2015-01-13 34 views
1
import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.ArrayList; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JList; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.border.EmptyBorder; 

public class IsPrimeNumber { 
    private static JTextField input; 
    private static JLabel title; 

    private static final int START = 2; 
    private static int end = 0; 
    public static void main(String[] args) { 
     runner(); 
    } 
    static void runner(){ 
     makeFrame(); 
    } 
    private static boolean isPrime(int num) { 
     if (num % 2 == 0 && num!=2)// checks if number is even, even numbers other than 2 are always not prime. 
      return false; 
     for (int i = 3; i * i <= num; i += 2) 
      if (num % i == 0) return false; return true; 
    } 
    private static void makeFrame()//creates and builds JFrame 
    { 
     final JFrame frame = new JFrame("isPrime"); 
     final JPanel contentPane = (JPanel)frame.getContentPane();//organize content. 
     contentPane.setLayout(new BorderLayout(8, 8)); 
     contentPane.setBorder(new EmptyBorder(10, 10, 10, 10)); 

     title = new JLabel(); 
     title.setText("Enter a # then press Enter!"); 
     contentPane.add(title, BorderLayout);//adds title 
     input = new JTextField(); 
     input.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent e) {//waits for enter press to add number. 
       try { 
        end = Integer.parseInt(input.getText()); //parses end grabbed from JTextField from String to Int 

        if(end<=1) 
         throw new RuntimeException(); 
        JList primeRangeList = new JList(makeList().toArray()); 
        JList primeFactorList = new JList(primeFactors().toArray()); 

        contentPane.add(primeRangeList, BorderLayout.NORTH); 
        contentPane.add(primeFactorList, BorderLayout.SOUTH); 
        title.setText("Press enter to try another #!"); 
       } catch (NumberFormatException a) { 
        title.setText("Not a Valid #, try again!");//changes title in even of error. 
        end = 0; 
       } catch (RuntimeException r) { 
        if (end == 1) 
         title.setText("There are no prime #s below 1 :("); 
        else 
         title.setText("You cannot use negative numbers :("); 
       } 
       frame.pack(); 
      } 
     }); 
     contentPane.add(input, BorderLayout.SOUTH); 
     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    public static ArrayList<Integer> primeFactors() { 
     ArrayList<Integer> factors = new ArrayList<Integer>(); 
     for (int i = 2; i <=end; i++) { 
      while (end % i == 0) { 
       factors.add(i); 
       end /= i; 
      } 
     } 
     return factors; 
    } 

    public static ArrayList<Integer> makeList(){//creates array list of possible numbers. 
     ArrayList<Integer>makeList= new ArrayList<Integer>(); 
     for (int i = START; i <= end; i++) 
      if (isPrime(i)) 
       makeList.add(i); 
     return makeList; 
    } 
} 

我有點難以獲得元素傳播到框架正確。 如果您輸入的數字返回一個帶有10個點的JList,但是嘗試檢查返回5個點的JList,您又會得到標籤,文本字段和兩個JLists的巨大重疊。在程序中重疊ArrayLists重疊JLists

如果任何人都可以告訴我我出錯的地方,那會很酷。

謝謝。

+1

你能描述一個它按預期工作的情況嗎?另外,我可能會建議在添加它們之前將所有元素放入它們自己的JPanel中,這似乎總能解決我的問題。 – DaaaahWhoosh

回答

2

通常,您創建一次Swing組件,然後更改GUI中的文本。

我無法讓整數列表正常工作,所以我使用了DefaultListModels代替。

這是我創建的GUI。

JFrame

這裏是代碼。

package com.ggl.testing; 

import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.BorderFactory; 
import javax.swing.Box; 
import javax.swing.BoxLayout; 
import javax.swing.DefaultListModel; 
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 IsPrimeNumber implements Runnable { 

    private DefaultListModel<Integer> primeRangeModel; 
    private DefaultListModel<Integer> primeFactorModel; 

    private JLabel message; 

    private JList<Integer> primeRangeList; 
    private JList<Integer> primeFactorList; 

    private JTextField input; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new IsPrimeNumber()); 
    } 

    public IsPrimeNumber() { 
     this.primeRangeModel = new DefaultListModel<Integer>(); 
     this.primeFactorModel = new DefaultListModel<Integer>(); 
    } 

    @Override 
    public void run() { 
     JFrame frame = new JFrame("isPrime"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel mainPanel = new JPanel(); 
     mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS)); 

     JPanel numberPanel = new JPanel(); 
     numberPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 10, 10)); 
     numberPanel.setLayout(new BoxLayout(numberPanel, BoxLayout.PAGE_AXIS)); 

     JLabel title = new JLabel(); 
     title.setText("Enter a number, then press Enter"); 
     numberPanel.add(title); // adds title 

     input = new JTextField(); 
     input.addActionListener(new PrimeActionListener()); 
     numberPanel.add(input); 

     message = new JLabel(" "); 
     message.setForeground(Color.RED); 
     numberPanel.add(message); 

     mainPanel.add(numberPanel); 
     mainPanel.add(Box.createVerticalStrut(10)); 

     JPanel primeRangePanel = new JPanel(); 
     primeRangePanel.setBorder(BorderFactory 
       .createTitledBorder("Prime Range")); 

     primeRangeList = new JList<Integer>(primeRangeModel); 
     JScrollPane primeRangeScrollPane = new JScrollPane(primeRangeList); 
     primeRangePanel.add(primeRangeScrollPane); 

     mainPanel.add(primeRangePanel); 

     JPanel primeFactorPanel = new JPanel(); 
     primeFactorPanel.setBorder(BorderFactory 
       .createTitledBorder("Prime Factors")); 

     primeFactorList = new JList<Integer>(primeFactorModel); 
     JScrollPane primeFactorScrollPane = new JScrollPane(primeFactorList); 
     primeFactorPanel.add(primeFactorScrollPane); 

     mainPanel.add(primeFactorPanel); 

     frame.add(mainPanel); 

     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public class PrimeActionListener implements ActionListener { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      clearModels(); 
      int start = 2; 
      int end = 0; 
      try { 
       end = Integer.parseInt(input.getText().trim()); 
       if (end <= 1) { 
        throw new RuntimeException(); 
       } 
       primeRanges(start, end); 
       primeFactors(end); 
       message.setText(" "); 
      } catch (NumberFormatException a) { 
       message.setText("Not a valid number, try again :("); 
      } catch (RuntimeException r) { 
       if (end >= 0) { 
        message.setText("There are no prime numbers below 2 :("); 
       } else { 
        message.setText("You cannot use negative numbers :("); 
       } 
      } 
     } 

     private void clearModels() { 
      primeRangeModel.clear(); 
      primeFactorModel.clear(); 
     } 

     private void primeRanges(int start, int end) { 
      for (int i = start; i <= end; i++) { 
       if (isPrime(i)) { 
        primeRangeModel.addElement(i); 
       } 
      } 
     } 

     private void primeFactors(int end) { 
      for (int i = 2; i <= end; i++) { 
       while (end % i == 0) { 
        primeFactorModel.addElement(i); 
        end /= i; 
       } 
      } 
     } 

     private boolean isPrime(int num) { 
      if (num % 2 == 0 && num != 2) { 
       return false; 
      } 

      for (int i = 3; i * i <= num; i += 2) { 
       if (num % i == 0) { 
        return false; 
       } 
      } 

      return true; 
     } 
    } 
}