Я пытаюсь создать графический интерфейс Java динамически, беря значения из набора результатов и используя его для создания контрольного списка. Я создал небольшую демонстрационную программу, чтобы показать, что я сделал:Создание динамического GUI из ResultSet - Java
SQL команд
CREATE USER 'test'@'localhost' IDENTIFIED BY 'testpw';
CREATE DATABASE combotest;
USE combotest;
CREATE TABLE combotable (
id INT(5) NOT NULL PRIMARY KEY auto_increment,
type VARCHAR(50) NOT NULL);
INSERT INTO combotable (id, type) VALUES
(default, 'Label'),
(default, 'Textfield'),
(default, 'Combo'),
(default, 'Label'),
(default, 'Textfield'),
(default, 'Combo'),
(default, 'Combo');
GRANT SELECT ON combotest.* TO 'test'@'localhost';
Для вашего удобства, если вы хотите, чтобы проверить это самостоятельно, я поставил все SQL команды выше.
Теперь, для моего Java кода:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.*;
import javax.swing.*;
public class resToComboDemo implements ActionListener {
//JDBC Variables
static Connection connect = null;
static Statement statement = null;
static ResultSet res = null;
@SuppressWarnings("rawtypes")
//Other Variables
JComboBox comboBox;
JButton submit;
JFrame frame;
JLabel label;
JTextField textField;
Container pane;
public static void main(String[] args) throws SQLException {
new resToComboDemo();
}
public resToComboDemo() throws SQLException {
try {
Class.forName("com.mysql.jdbc.Driver");
// Setup the connection with the DB
connect = DriverManager
.getConnection("jdbc:mysql://localhost/combotest?"
+ "user=test&password=testpw");
statement = connect.createStatement();
//Note: in this specific case I do realize that "order by id" is not necessary. I want it there, though.
res = statement.executeQuery("SELECT * FROM combotable ORDER BY id");
createStuff(res);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "Error 1: "+e, "Error!", JOptionPane.ERROR_MESSAGE);
} finally {
connect.close();
}
}
@SuppressWarnings({"rawtypes", "unchecked" })
public void createStuff (ResultSet res) throws SQLException {
frame = new JFrame("Testing dynamic gui");
Dimension sD = Toolkit.getDefaultToolkit().getScreenSize();
int width = sD.width;
int height = sD.height - 45;
frame.setSize(width,height);
pane = frame.getContentPane();
pane.setLayout(new GridLayout(0, 2));
while (res.next()) {
Object[] options = { "Pass", "Fail"};
String type = res.getString("type");
JLabel label = new JLabel("<html><small>"+type+"</small></html>");
JLabel blank = new JLabel(" ");
blank.setBackground(Color.black);
blank.setOpaque(true);
if (type.equals("Label")) {
label.setBackground(Color.black);
label.setForeground(Color.white);
label.setOpaque(true);
pane.add(label);
pane.add(blank);
} else if (type.equals("Combo")) {
pane.add(label);
comboBox = new JComboBox(options);
pane.add(comboBox);
} else if (type.equals("Textfield")) {
pane.add(label);
textField = new JTextField(20);
pane.add(textField);
}
}
JLabel blank2 = new JLabel(" ");
pane.add(blank2);
submit = new JButton("Submit");
submit.addActionListener(this);
pane.add(submit);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
Теперь все прекрасно работает с созданием GUI здесь. Тем не менее, мне нужно уметь обрабатывать компоненты Combobox и Textfield как свои собственные отдельные объекты. Смысл, я хочу, чтобы получить пользовательский ввод от каждого другого компонента. Прямо сейчас, если я буду запрашивать информацию из текстового поля, он просто дает мне информацию из последнего текстового поля. Это прекрасно, потому что это так, как читает java. У меня нет проблем с этим.
Я просто не могу для жизни меня выяснить, как получить вход каждого компонента отдельно. Возможно, взяв результирующий набор и добавив результаты к некоторому типу массива? Я попытался это несколько раз в разных вкусах, и я не могу заставить его выйти так, как мне это нужно. Некоторые из вас попросят, чтобы я показал вам, что я пробовал ... но, честно говоря, это не стоит.
И, прежде чем кто-нибудь спросит: нет, я не буду использовать FlowLayout. :)
Любая помощь с благодарностью!
Почему их не поддерживали в массиве или списке? Я бы также рекомендовал устанавливать предупреждения, а не подавлять их. –
Ответ зависит. Вы заботитесь о записи 'id'? – MadProgrammer
@MadProgrammer, да, идентификатор является релевантным, потому что я могу потребовать, чтобы элементы находились в определенном порядке. – user2221125