Avatar billede langkiller Nybegynder
24. september 2012 - 12:16 Der er 9 kommentarer og
1 løsning

automatisk opdatering af indhold i JScrollPane

Har et JScrollPane panel i min frame som gerne skulle opdaterer sig selv løbende, har bare ingen ide om hvordan man får den til det?

her er koden til mit JScrollPane:

            JPanel centerPanel = new JPanel(new GridLayout(2,1));
                       
                // Panel der viser beskeder fra databasen
                    JScrollPane messagePanel = new JScrollPane();
                    messagePanel.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                    messagePanel.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
                    messagePanel.setViewportView(new JLabel("Connecting to the database. Please wait..."));
                   
                        // Viser beskeder fra klassen MessageWindow
                        MessageWindow getMes = new MessageWindow();
                        String messages = getMes.getMessages();
                        messagePanel.setViewportView(new JLabel(messages));
                           
                    centerPanel.add(messagePanel);



Den hente noget tekst fra min database igennem en anden klasse... Kan man få den til at hente teksten ind igen hvert 2. sekund eller sådan noget? eller måske er der en bedre måde at gøre dette på?
Avatar billede arne_v Ekspert
24. september 2012 - 14:53 #1
Det bedste er vel at lade det som producerer de nye messages opdatere.

Det naestbedste maa vaere at lade en traad polle og saa opdatere (husk at der skal opdateres fra event traaden!!).
Avatar billede langkiller Nybegynder
24. september 2012 - 16:01 #2
okay, så jeg er altså tvunget til at benytte mig af tråde til det ikke?
Er først lige blevet introduceret til tråde i programmering så må hellere lige sætte mig lidt bedre ind i det før jeg begynder at implementerer det.. Har du nogle gode fif's eller tutorials omkring det evt.? :)
Avatar billede arne_v Ekspert
24. september 2012 - 18:49 #3
en traad som poller er kun naestbedste loesning
Avatar billede arne_v Ekspert
24. september 2012 - 18:51 #4
Eksempel:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class NewDynNum extends JFrame implements ActionListener {
    private JTextField txt;
    private JButton btn;
    private int n;
    public NewDynNum() {
        n = 0;
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().setLayout(new BorderLayout());
        txt = new JTextField();
        txt.setText(Integer.toString(n));
        getContentPane().add(txt, BorderLayout.CENTER);
        btn = new JButton("Count 10 up");
        btn.addActionListener(this);
        getContentPane().add(btn, BorderLayout.SOUTH);
        pack();
    }
    public void incr() {
        n++;
        txt.setText(Integer.toString(n));
    }
    public void actionPerformed(ActionEvent ev) {
        if (ev.getSource() == btn) {
            T t = new T(this);
            t.start();
        }
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                NewDynNum f = new NewDynNum();
                f.setVisible(true);
            }
        });
    }
}

class T extends Thread {
    private NewDynNum dn;
    public T(NewDynNum dn) {
        this.dn = dn;
    }
    public void run() {
        for (int i = 0; i < 10; i++) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    dn.incr();
                }
            });
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
    }
}
Avatar billede arne_v Ekspert
24. september 2012 - 18:51 #5
Andet eksempel:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class MovingBalls extends JFrame {
    public MovingBalls() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Moving balls");
        getContentPane().setLayout(new BorderLayout());
        Ball red = new Ball(200,200,50,Color.RED);
        Ball green = new Ball(400,200,50,Color.GREEN);
        Ball blue = new Ball(400,400,50,Color.BLUE);
        Ball yellow = new Ball(200,400,50,Color.YELLOW);
        MultiBalls mb = new MultiBalls(600, 600);
        mb.addBall(red);
        mb.addBall(green);
        mb.addBall(blue);
        mb.addBall(yellow);
        getContentPane().add(mb);
        (new BallMover(red, mb)).start();
        (new BallMover(green, mb)).start();
        (new BallMover(blue, mb)).start();
        (new BallMover(yellow, mb)).start();
        pack();
       
    }
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame f = new MovingBalls();
                f.setVisible(true);
            }
        });
    }
}
class MultiBalls extends JPanel {
    private List<Ball> balls;
    public MultiBalls(int w, int h) {
        setPreferredSize(new Dimension(w, h));
        balls = new ArrayList<Ball>();
    }
    public void addBall(Ball b) {
        balls.add(b);
    }
    @Override
    public void paint(Graphics g) {
        g.setColor(Color.WHITE);
        g.fillRect(0, 0,getWidth(), getHeight());
        for(Ball b : balls) {
            g.setColor(b.getC());
            g.fillOval(b.getX() - b.getR(), b.getY() - b.getR(), 2*b.getR(), 2*b.getR());
        }
    }
}
class Ball {
    private volatile int x;
    private volatile int y;
    private int r;
    private Color c;
    public Ball(int x, int y, int r, Color c) {
        this.x = x;
        this.y = y;
        this.r = r;
        this.c = c;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
    public int getR() {
        return r;
    }
    public void setR(int r) {
        this.r = r;
    }
    public Color getC() {
        return c;
    }
    public void setC(Color c) {
        this.c = c;
    }
}
class BallMover extends Thread {
    private Random rng = new Random(getId() + System.currentTimeMillis());
    private Ball b;
    private JPanel p;
    public BallMover(Ball b, JPanel p) {
        this.b = b;
        this.p = p;
    }
    @Override
    public void run() {
        for(;;) {
            try {
                Thread.sleep(250);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            int x = b.getX() + rng.nextInt(21) - 10;
            int y = b.getY() + rng.nextInt(21) - 10;
            x = Math.max(x, b.getR());
            x = Math.min(x, p.getWidth() - b.getR());
            y = Math.max(y, b.getR());
            y = Math.min(y, p.getHeight() - b.getR());
            b.setX(x);
            b.setY(y);
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    p.repaint();
                }
            });
        }
    }
}
Avatar billede langkiller Nybegynder
24. september 2012 - 21:48 #6
"Det bedste er vel at lade det som producerer de nye messages opdatere."
Det der producerer de nye messages er i en klasse for sig selv... vil det sige at jeg inde i den klasse skal have 2 tråde kørende? eller.. ?
Avatar billede langkiller Nybegynder
24. september 2012 - 21:49 #7
og tak for de 2 eksempler, dem kan jeg nok bruge når jeg har fået lidt mere rutine med threads :)
Avatar billede langkiller Nybegynder
24. september 2012 - 22:32 #8
Følgende henter fra databasen og returnerer en html streng som jeg bruger i den første klasse (i mit JScrollPane panel).
Hvordan kan jeg få den til at læse disse data ind løbende?

package userSystem;

import java.sql.*;

public class MessageWindow 

   
    public String getMessages()
    {
        String returnData = "<html>";
        try {
           
                // Forbinder til database
                Class.forName("com.mysql.jdbc.Driver");
                Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/bum","root","");
               
                // Henter beskeder fra database
                PreparedStatement statement = con.prepareStatement("SELECT * FROM messages");
                ResultSet result = statement.executeQuery();
               
                   
                    // Saetter informationerne ind i i html strengen
                    int countRows = 0;
                    while(result.next()) {
                        returnData = returnData + "<u>" + result.getString(2) + "</u>: "+ result.getString(4) + "<p>";
                        countRows++;
                    }
                    returnData = returnData + "</html>";
               
                // Lukker forbindelsen
                con.close();
               
       
        } catch (Exception e) {
            System.out.println("ERROR FETCHING MESSAGE IN MessageWindow Class (getMessages())");
            returnData = "ERROR FETCHING MESSAGE IN MessageWindow Class (getMessages())";
        }
       
        return returnData;
   
    } 
}
Avatar billede langkiller Nybegynder
25. september 2012 - 11:42 #9
brugte dit eksempel med tråde, det virker perfekt nu .
tak for hjælpen ! smid et svar hvis du vil have points
Avatar billede arne_v Ekspert
25. september 2012 - 15:34 #10
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester