- 论坛徽章:
- 0
|
问题是我在Eclipse中编译的时候图片能够调用,但是打成jar后,双击运行却显示不出来。
我的源码:
package count;
// UpperPanel.java
// 此类是所有计算类的父类,提供公共的借口给各个子类
//
import java.awt.*;
import java.awt.event.*;
import java.io.InputStream;
import java.security.AccessControlException;
import javax.swing.*;
public abstract class UpperPanel extends JPanel implements ActionListener {
private static int Number;
private GridBagLayout bagLayout;
private GridBagConstraints constraints;
// 计算类名称
private String name;
// 参数的个数
private int parameterNumber;
// 对计算的描述
private JTextArea describeArea;
// 显示参数的内部面板
private JPanel innerPanel;
private JLabel[] parLabels;
private JTextField[] parFields;
// 计算按钮
private JButton count;
// 显示结果
private JTextArea resultArea;
public UpperPanel(String name, String describe, String[] parName) {
Number++;
this.name = name;
parameterNumber = parName.length;
bagLayout = new GridBagLayout();
setLayout(bagLayout);
constraints = new GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
describeArea = new JTextArea(describe);
describeArea.setEditable(false);
describeArea.setLineWrap(true);
JScrollPane scrollPane = new JScrollPane(describeArea);
constraints.weightx = 1000;
constraints.weighty = 1;
addComponent(scrollPane, 0, 0, 1, 3);
constraints.fill = GridBagConstraints.NONE;
constraints.weightx = 0;
constraints.weighty = 0;
innerPanel = new JPanel();
innerPanel.setLayout(new GridLayout(0, 6));
parLabels = new JLabel[parameterNumber];
parFields = new JTextField[parameterNumber];
for (int i = 0; i < parameterNumber; i++) {
/*
try {
parLabels[i] =new JLabel(new ImageIcon("count/images/" +parName[i] +".gif"));
}
catch(AccessControlException e) {
parLabels[i] =new JLabel(parName[i]);
}
parLabels[i] =new JLabel(new ImageIcon("count/images/" +parName[i] +".gif"));
*/
Image m_image = null;
try {
InputStream in = getClass().getResourceAsStream(
"images/" + parName[i] + ".gif");
if (in == null) {
System.err.println("Image not found.");
return;
}
byte[] buffer = new byte[in.available()];
in.read(buffer);
m_image = Toolkit.getDefaultToolkit().createImage(buffer);
}
catch (java.io.IOException e) {
System.err.println("Unable to read image.");
e.printStackTrace();
}
parLabels[i] = new JLabel(new ImageIcon(m_image));
parFields[i] = new JTextField();
innerPanel.add(parLabels[i]);
innerPanel.add(parFields[i]);
}
addComponent(innerPanel, 0, 1, 1, 1);
constraints.fill = GridBagConstraints.BOTH;
count = new JButton("计算");
count.addActionListener(this);
addComponent(count, 1, 1, 1, 1);
resultArea = new JTextArea("计算结果:\n");
resultArea.setEditable(false);
resultArea.setLineWrap(true);
JScrollPane scrollPane2 = new JScrollPane(resultArea);
addComponent(scrollPane2, 2, 1, 1, 1);
}
private void addComponent(Component component, int row, int column,
int width, int height) {
constraints.gridx = column;
constraints.gridy = row;
constraints.gridwidth = width;
constraints.gridheight = height;
this.add(component, constraints);
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getParameterNumber() {
return parameterNumber;
}
public int getNumber() {
return Number;
}
public JTextArea getResultArea() {
return resultArea;
}
public JTextArea getDescribeArea() {
return describeArea;
}
public void setDescribeArea(String describe) {
describeArea.setText(describe);
}
// 子计算类实现相应的功能
public abstract double count();
// 搜集用户输入的参数,并通过一个double数组输出
protected double[] getParameter() {
double[] result = new double[parameterNumber];
String st = "";
for (int i = 0; i < parameterNumber; i++) {
st = parFields[i].getText();
if (st == "" || st == null || st.equals("")) {
result[i] = 0.0;
continue;
}
else {
try {
result[i] = Double.parseDouble(parFields[i].getText());
}
catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null, "输入参数错误!", "错误",
JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
}
return result;
}
// 计算并输出
public void actionPerformed(ActionEvent e) {
double result = count();
resultArea.append("" + result + "\n");
}
}
Main类调用count文件夹下的计算子类(继承自UpperPanel),图片是在count文件夹下的images文件夹下。 |
|