如何使用Swing在按钮内打印void方法



我很新,如果我使用了不正确的术语,我很抱歉。我正在尝试学习Swing并将其导入到我当前的项目中。在我的主文件中,一个方法从mysql数据库中打印一个列表。我想要这样:当按下按钮时,将此输出打印到文本字段或对话框窗口,显示在gui上,而不仅仅是cmd输出。我希望我能正确地解释我的请求。我使用Netbeans作为IDE。

Baglanti.java:中的方法

public void dogList() {
String sorg = "Select * From dogs";
NewJFrame frame1 = new NewJFrame();


try {
statement = con.createStatement();
ResultSet rs = statement.executeQuery(sorg);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String species = rs.getString("species");
int age = rs.getInt("age");
String owner = rs.getString("owner");
String date = rs.getString("date");
System.out.println(" id : " + id + " name: " + name+ " species: " + species+ " age: " + age+ " owner: " + owner+ " date: " + date);
}

} catch (SQLException ex) {
Logger.getLogger(Baglanti.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

和NewJFrame.java 中的我的列表按钮

private void listbuttonActionPerformed(java.awt.event.ActionEvent evt) {                                           
Baglanti baglanti = new Baglanti();       
// i don't know what next

谢谢。

因此,首先,让我们修复您的doglist((方法。我给了它一个PrintStream参数,这样它既可以与System.out一起使用,也可以与任何其他PrintStream一起使用。我还取出了";NewJFrame";创造这不应该去那里。

public void dogList(PrintStream stream) {
String sorg = "Select * From dogs";
//Take this out
//NewJFrame frame1 = new NewJFrame();


try {
statement = con.createStatement();
ResultSet rs = statement.executeQuery(sorg);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String species = rs.getString("species");
int age = rs.getInt("age");
String owner = rs.getString("owner");
String date = rs.getString("date");
stream.println(" id : " + id + " name: " + name+ " species: " + species+ " age: " + age+ " owner: " + owner+ " date: " + date);
}

} catch (SQLException ex) {
Logger.getLogger(Baglanti.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

现在,您只需要一个JTextField或Dialog的PrintStream。最简单的方法是使用ByteArrayOutputStream,然后将其转换为String并在JComponent 中设置

ByteArrayOutputStream bstream = new ByteArrayOutputStream();
PrintStream myPS = new PrintStream(bstream);
dogList(myPS);
String msg = new String(bstream.getBytes());

现在您可以使用JTextField.setText(msg(,或者在JFrame/Dialog中执行类似的操作。

似乎不需要在Baglanti类的dogList方法中创建NewJFrame的另一个实例。

此外,每次按下按钮时,在NewJFrame中创建Baglanti类的实例可能是多余的。只要有一个此类的实例负责从数据库中检索数据就足够了。

接下来,您需要重构dogList方法的代码,以便它开始向调用方返回相关数据类的列表(例如Dog(。然后,您将能够在框架中使用此列表,并根据需要显示其数据:在文本区域、表格、列表等中。

话虽如此,一些代码片段:

// data transfer class Dog
public class Dog {
private int id;
private String name;
private String species;
private int age;
private String owner;
private String date;
// constructor with all args, getters/setters
}
import java.util.*;
public class Baglanti {
// ...
public List<Dog> dogList() {
String sorg = "Select * From dogs";
List<Dog> result = new ArrayList<>();
try (statement = con.createStatement()) { // use try-with-resources to make sure the statement is closed
ResultSet rs = statement.executeQuery(sorg);
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String species = rs.getString("species");
int age = rs.getInt("age");
String owner = rs.getString("owner");
String date = rs.getString("date");
System.out.println(" id : " + id + " name: " + name+ " species: " + species+ " age: " + age+ " owner: " + owner+ " date: " + date);
// assuming all-args constructor is implemented in Dog
Dog dog = new Dog(id, name, species, age, owner, date);
result.add(dog);
}
} catch (SQLException ex) {
Logger.getLogger(Baglanti.class.getName()).log(Level.SEVERE, null, ex);
}
return result;
}
// ... other methods
}

NewJFrame:中的剩余部分

public class NewJFrame extends JFrame {
Baglanti baglanti = new Baglanti();
//... other UI components
private void listbuttonActionPerformed(java.awt.event.ActionEvent evt) {
List<Dog> dogs = baglanti.dogList();
for (Dog dog : dogs) {
// set information about the dog in other UI components
textArea.append(String.format("Dog id=%d named: %s, age %d years, owner: %s",
dog.getId(), dog.getName(), dog.getAge(), dog.getOwner()));
}
}
}

最新更新