Обновление контента Java в кадре - PullRequest
0 голосов
/ 20 августа 2010

В настоящее время я работаю над примером приложения в Java. Я на самом деле не использовал java для чего-то большего, чем просто привет, поэтому, пожалуйста, потерпите меня Я настроил свое приложение так, чтобы оно запрашивало базу данных mysql. Проблема, с которой я столкнулся, связана с обновлением содержимого во фрейме. В настоящее время я открываю новое окно с контентом при каждом запросе. Это связано с моим ограниченным знанием Java. Я хотел бы обновить содержимое в рамке, не создавая новое окно. вот код:

// Import the swing and AWT classes needed
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.BoxLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.*;
import java.awt.Component;
import java.awt.Container;
import java.util.*;
import java.awt.event.*;
import java.util.Timer;
import java.util.TimerTask;
/**
 * Basic Swing example.
 */
public class client extends JPanel {

    public static void main(String[] args) {

        // Make sure all Swing/AWT instantiations and accesses are done on the
                // Create a JFrame, which is a Window with "decorations", i.e. 
                // title, border and close-button
                JFrame f = new JFrame("Densebrain Test Client");

                // Set a simple Layout Manager that arranges the contained 
                // Components
                f.setLayout(new FlowLayout());

                // Add some Components
                f.add(new JLabel("Hello, world!"));
                f.add(new JButton("Press me!"));
                // "Pack" the window, making it "just big enough".
                f.pack();

                // Set the default close operation for the window, or else the 
                // program won't exit when clicking close button
                //  (The default is HIDE_ON_CLOSE, which just makes the window
                //  invisible, and thus doesn't exit the app)
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                // Set the visibility as true, thereby displaying it
                f.setVisible(true);

int delay = 0;   // delay for 5 sec.
int period = 5000;  // repeat every sec.
Timer timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {
        public void run() {
            runn();
        }
    }, delay, period);
        //runn();
    }
    public static void runn() {
         Connection con = null;
         Statement stmt = null;
         ResultSet rs = null;
        try {
          Class.forName("com.mysql.jdbc.Driver").newInstance();
          con = DriverManager.getConnection("jdbc:mysql://localhost:3306/densebrain",
            "root", "");

          if(!con.isClosed())
        {
            System.out.println("Successfully connected to " +
              "MySQL server using TCP/IP...");
            stmt = con.createStatement();
            try {
                rs = stmt.executeQuery( "SELECT * FROM posts" );
                try {
                    JFrame f = new JFrame("POSTS");

                    f.setLayout(new GridLayout(40,1));
                    //pane = f.getContentPane();
                    //getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
                    while ( rs.next() ) {
                        int numColumns = rs.getMetaData().getColumnCount();
                        for ( int i = 1 ; i <= numColumns ; i++ ) {
                           // Column numbers start at 1.
                           // Also there are many methods on the result set to return
                           //  the column as a particular type. Refer to the Sun documentation
                           //  for the list of valid conversions.
                           System.out.println( "COLUMN " + i + " = " + rs.getObject(i) );
                            switch(i)
                            {
                                case 1: 
                                break;
                                case 2: f.add(new JLabel("NAME = " + rs.getObject(i)));
                                break;
                                case 3: f.add(new JLabel("CONTENT = " + rs.getObject(i)));
                                break;
                                case 4: f.add(new JLabel("CREATED = " + rs.getObject(i)));
                                break;
                            }

                        }
                        f.add(new JLabel("*********"));
                    }
                f.pack();

                // Set the default close operation for the window, or else the 
                // program won't exit when clicking close button
                //  (The default is HIDE_ON_CLOSE, which just makes the window
                //  invisible, and thus doesn't exit the app)
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                // Set the visibility as true, thereby displaying it
                f.setVisible(true);
                } finally {
                    try { rs.close(); } catch (SQLException ignore) { /* Propagate the original exception instead of this one that you may want just logged */ }
                }
            } finally {
                try { stmt.close(); } catch (SQLException ignore) { /* Propagate the original exception instead of this one that you may want just logged */ }
            }
        }

        } catch(Exception e) {
          System.err.println("Exception: " + e.getMessage());
        } finally {
          try {
            if(con != null)
              con.close();
          } catch(SQLException e) {}
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 20 августа 2010

Лучший способ отобразить данные из базы данных - использовать JTable. Прочитайте раздел из учебника по Swing на Как использовать таблицы .

Теперь, когда вы захотите заменить данные, вы можете просто создать новую DefaultTableModel. Для каждой строки в ResultSet вы используете метод DefaultTableModel.addRow (..), чтобы добавить данные в модель. Когда вы закончите чтение ResultSet, вы просто добавляете модель в таблицу, используя:

table.setModel(...);
0 голосов
/ 20 августа 2010

Вы можете поместить фрейм с его компонентами в класс и дать этому классу методы для изменения компонентов. Итак, класс, который имеет ссылку на фрейм и его компоненты.

JFrame thisframe
JLabel thislabel = new JLabel("somedeafaulttext");
// etc.

Тогда вы могли бы написать такой метод:

void updateText(String text){
thisLabel.setText(text);
}  

вместо создания новых ярлыков при каждом обновлении. Насколько я знаю, когда вы вызываете эти методы set для JComponents, они автоматически обновляются.

...