【问题标题】:create jcomponents using database使用数据库创建 jcomponents
【发布时间】:2014-02-23 15:41:13
【问题描述】:

我想使用数据库动态创建 jcomponents。当我打开任何 jframe 或 jpanel 组件(如 jlabel、jtextfields、jcombobox 等)时,应通过读取数据库行来创建。 我对如何从数据库值(即字符串中的 jcomponent 对象)提供引用感到困惑。 这是我的数据库表

    try{
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","pass");
        stat = con.createStatement();
        ResultSet rs = stat.executeQuery("select * from design");
        while(rs.next()){
            jTextField1 = new JTextField();
            jTextField1.setSize(rs.getInt("height"),rs.getInt("width"));
            jTextField1.setLocation(rs.getInt("x"), rs.getInt("y"));
        }
        rs.close();
        stat.close();
        con.close();
    }
    catch(Exception e){
        System.out.println(e);
    }

这是演示表。 我知道这行不通,因为我无法与对象和数据库进行通信。 我想在 jframe 上打印 jcomponents。我将编写 for 循环以多次打印它们。 请帮帮我。

【问题讨论】:

  • 到目前为止你尝试了什么?你至少解决了数据库连接部分吗?有什么代码可以展示吗?
  • 我也在尝试请不要关闭这个问题。我正在使用普通的结果集,例如:jtextfield a = new jtextfiled();a.setSize(rs.getInt(height),rs.getInt(width));
  • 请投票重新打开,因为此问题在关闭后已被编辑。

标签: java mysql swing


【解决方案1】:

首先看看@AndrewThompson 的明智建议:

Java GUI 可能必须在不同的平台上工作 屏幕分辨率和使用不同的 PLAF。因此他们不是 有利于元件的准确放置。组织组件 对于健壮的 GUI,请改用布局管理器或以下组合 它们,以及空白的布局填充和边框。

这里有一些有用的主题来理解它的含义:

您会看到我们强烈建议不要使用 setLocation()setBounds()setSize() 等方法。但是,在应用到允许自定义表单之前,我已经看到了这种方法。但是,您可以存储GridBagLayout 的约束,而不是特定的 (x,y) 坐标和固定的 (width,height)。假设您有一张这样的表格:

我会首先从一个类开始包装数据库中的数据:

public class Data {
    private String componentType, text;
    private int column, row, width, height, weightX, weightY;

    public Data(String componentType, int column, int row, int width, int height
                ,int weightX, int weightY, String text) {

        this.componentType = componentType;
        this.column = column;
        this.row = row;
        this.width = width;
        this.height = height;
        this.weightX = weightX;
        this.weightY = weightY;
        this.text = text;
   }

   // getters and setters here
}

由于数据库调用是耗时的任务,您必须考虑使用SwingWorker 在后台线程中执行数据库调用(耗时任务)并在Event Dispatch Thread 中创建/更新您的 GUI。

说了这么多,你可能会有这样的事情:

public class Demo {

    private JPanel content;
    private JFrame frame;

    private void createAndShowGUI() {        
        content = new JPanel(new GridBagLayout());

        SwingWorker<Void, Data> worker = new SwingWorker<Void, Data>() {
            @Override
            protected Void doInBackground() {                    
                try{
                   Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db","root","password");
                   Statement stat = con.createStatement();
                   ResultSet rs = stat.executeQuery("select * from TableName");
                   while(rs.next()){
                      String componentType = rs.getString("component");
                      int column = rs.getInt("x");
                      int row = rs.getInt("y");
                      int width = rs.getInt("width");
                      int height = rs.getInt("height");
                      int weightx = rs.getInt("weightx");
                      int weighty = rs.getInt("weighty");
                      String text = rs.getString("text");
                      Data data = new Data(componentType, column, row, width, height
                                          ,weightx, weighty, text);
                      publish(data);
                  }
                  rs.close();
                  stat.close();
                  con.close();
              } catch(Exception e) {
                  System.out.println(e);
              }

                return null;
            }

            @Override
            protected void process(List<Data> chunks) {
                for(Data data : chunks) {

                    JComponent component = null;
                    if(data.getComponentType().equalsIgnoreCase("JTextField")) {
                        component = new JTextField(data.getText());
                    }

                    if(data.getComponentType().equalsIgnoreCase("JComboBox")) {
                        component = new JComboBox();
                    }

                    if(data.getComponentType().equalsIgnoreCase("JLabel")) {
                        component = new JLabel(data.getText());
                    }

                    if(component != null) {
                        GridBagConstraints constraints = new GridBagConstraints();
                        constraints.gridx = data.getColumn();
                        constraints.gridy = data.getRow();
                        constraints.gridwidth = data.getWidth();
                        constraints.gridheight = data.getHeight();
                        constraints.weightx = data.getWeightX();
                        constraints.weighty = data.getWeightY();

                        constraints.anchor = GridBagConstraints.WEST;
                        constraints.fill = GridBagConstraints.BOTH;
                        constraints.insets = new Insets(8,8,8,8);
                        content.add(component, constraints);
                    }

                }
            }

            @Override
            protected void done() {
                frame = new JFrame("Demo");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.getContentPane().add(content);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        };

        worker.execute();
    }


    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Demo().createAndShowGUI();
            }
        });
    }
}

你会看到这样的东西:

【讨论】:

  • 什么是发布(数据);
  • publish() 是 SwingWorker 类的方法。它将一个对象放入队列中,当调用process() 方法时将处理该队列。您需要了解 SwingWorker 类以及它如何同步后台线程和事件调度线程。这是关于 Swing 中的并发性。 @Ashish
  • 什么是 weightx 和 weighty 在表中。我们为什么要使用它。
  • @Ashish 在这里解释得很好:How to Use GridBagLayout。这种方法的重点是避免固定组件的位置和大小,因为我引用了 Andrew 的评论。但是,如果您存储 GridBagLayout 约束,那么布局管理器将处理此问题(应该如此)。如果我足够清楚,请告诉我。
  • 无法解决`方法equalsIgnoreCase(String)`中的type List does not take parameters.cannot find symbol
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2011-01-07
  • 2019-07-10
相关资源
最近更新 更多