autoscroll

teslar

Aktives Mitglied
moin


ich habe mit netbeans ein jframe gemacht, darauf ein jpanel und dann scrollpane mit textarea und 2knöpfe

folgender quelltext ist daraufhin entstanden, das programm kommuniziert mit einem server und die main-methode befindet sich in einem ausgelagerten teil des programmes.

Java:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * NewJFrame.java
 *
 * Created on 10.11.2011, 17:25:02
 */
package client;

import NetEngine.client;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 *
 * @author Vera
 */
public class NewJFrame extends javax.swing.JFrame {

    int a=0;
    client clt;
    /** Creates new form NewJFrame */
    public NewJFrame() {
        initComponents();
        setVisible(true);
        clt=new client("127.0.0.1",9513) {
            @Override
            public void client_out(String string) {
                jTextArea1.append("\n"+string);//bei einem eingehenden string wird dieser ausgegeben
            }
        };
    /* jScrollPane1.setCorner(ScrollPaneConstants.LOWER_LEFT_CORNER, jPanel1);*/
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jPanel1.setBackground(new java.awt.Color(126, 157, 11));

        jScrollPane1.setAutoscrolls(true);

        jTextArea1.setColumns(20);
        jTextArea1.setEditable(false);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);

        jTextField1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jTextField1ActionPerformed(evt);
            }
        });

        jButton1.setBackground(new java.awt.Color(126, 157, 11));
        jButton1.setText("Enter");
        jButton1.setToolTipText("Sende deine Nachricht/deinen Befehl");
        jButton1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setBackground(new java.awt.Color(255, 0, 0));
        jButton2.setText("Ende");
        jButton2.setToolTipText("Beende das Spiel");
        jButton2.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jTextField1)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jButton1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jButton2)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2))
                .addContainerGap(13, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                        

    private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:
    }                                           

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        String x = jTextField1.getText();                       //is sozusagen enter, verbindung wird abgefragt, und dementsprechend wird agiert
        if (a == 0) {
            clt.client_start(x);
            a++;
        } else if (a == 1) {
            if (x.equalsIgnoreCase("/stop") == true) {
                clt.client_stop();
                a--;
                //system.exit oder so
            } else {
                try {
                    clt.anfrage_get(x);
                } catch (IOException ex) {
                    Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if (a==1) {
            clt.client_stop();//programm beenden button
        }
        System.exit(0);
    }                                        

    /**
     * @param args the command line arguments
     */
    /**
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new NewJFrame().setVisible(true);
                
            }
        });
    }**/
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration                   
}

problem ist, das der nicht von selbst nachscrollt, wenn ein signal ausgegeben wird.

frage1. woran liegt das?
frage2. wie kann man es beheben?

danke schonmal im vorraus

edit: bei dem generator vom programm habe ich sowohl bei den scrollpanes, als auch bei der textarea autoscroll auf true gesetzt
 
Zuletzt bearbeitet:

HelgeW

Mitglied
Wenn Du den Text hinzufügst, dann musst Du dem ScrollPane sagen, wohin es soll.

So etwas in der Art wie:

scr.scrollRectToVisible( new Rectangle(0,textPanel.getHeight()-2,1,1));
 

Michael...

Top Contributor
setAutoscrolls(...) wirkt sich nur auf das Verhalten beim Ziehen mit gedrückter Maustaste aus. (siehe API Doku) Entweder wie bereits erwähnt am Textfeld scrollRectToVisible(...) verwendet, alternativ sollte es bei einem Textfeld auch helfen, einfach den Cursor ans Ende des Textes zu setzen.
 

teslar

Aktives Mitglied
ich bin im moment nich so gut in java unterwegs,

bei dem scrollRectToVisible( new Rectangle(0,textPanel.getHeight()-2,1,1)); da scrollt er zwar mit, es fehlt aber immer die unterste zeile

und ich weis auch nich wie man den curser setzt, oder meinst du diese schieber von der scrollpane?

edit: habe auch andere methoden ausprobiert, und mir fehlt immer die letzte zeile, wenn ich den append befehl umdrehe, also
Java:
 jTextArea1.append(string+"\n");

seh ich zwar immer die neuste zeile mit Text, aber auch nur weil ja dann immer eine leerzeile darauf folgt.
aber ich möcht halt wirklich bis nach ganz unten ;(
 
Zuletzt bearbeitet:

Xeonkryptos

Bekanntes Mitglied
Ich hatte mal das selbe Problem, wie du jetzt gerade. Mir wurde hiermit geholfen:
Java:
tpMessageProcessNew.setCaretPosition(tpMessageProcessNew
					.getDocument().getLength());

Dabei stellt tpMessageProcessNew meine TextArea bzw um genau zu sein, mein TextPane dar. Damit sollte der "Balken" sich bis ganz nach unten verschieben lassen.
 

Ähnliche Java Themen

Neue Themen


Oben