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
如果任何人都可以告訴我我出錯的地方,那會很酷。
謝謝。
你能描述一個它按預期工作的情況嗎?另外,我可能會建議在添加它們之前將所有元素放入它們自己的JPanel中,這似乎總能解決我的問題。 – DaaaahWhoosh