Hallo Java-Forum,
ich habe nun mal eine "kleine" Demo meiner Anwendung gebastelt.
Die Probleme dabei wären folgende:
1.) Die Progressbar soll den Lade-Prozess visualisieren, doch leider erscheint sie erst nachdem der Vorgang schon beended wurde. => Ich arbeite aber bereits mit InvokeLater() und mache sogar eine kurze Pause, damit das System Zeit für die Aktualisierung der Progressbar hat - leider bringt dies scheinbar nichts... ;(
2.) Damit die Ladeanzeige korrekte Werte anzeigt, muss ich immer noch die 2 Byte für den Zeilenumbruch hinzufügen:
Bei Dateien mit Unix-Format wäre dies aber nur 1 Zeichen. Kann mir der BufferedReader evtl. sagen, um was für eine Datei es sich handelt?
3.) Mit jeder Datei, welche ich hereinziehe, wird ein neues Tab erstellt. Nun möchte ich mit den Pfeiltasten Nach-Links und Nach-Rechts zwischen den Tabs wechseln, auch wenn der Fokus auf der JList liegt. - Wie muss man hierfür vorgehen?
Ich würde auch gern das KeyBinding der JTabbedPane überschreiben, da hier original beim letzten Tab stets wieder auf den ersten gesprungen wird (und umgekehrt). Dieses Verhalten finde ich störend.
Es wäre sehr nett von euch, wenn sich jemand dieser Demo mal annehmen und mir weiterhelfen würde.
Hier ist meine Demo:
[WR]Der Code benötigt die Klasse FileDrop[/WR]
Vielen Dank!!!
ich habe nun mal eine "kleine" Demo meiner Anwendung gebastelt.
Die Probleme dabei wären folgende:
1.) Die Progressbar soll den Lade-Prozess visualisieren, doch leider erscheint sie erst nachdem der Vorgang schon beended wurde. => Ich arbeite aber bereits mit InvokeLater() und mache sogar eine kurze Pause, damit das System Zeit für die Aktualisierung der Progressbar hat - leider bringt dies scheinbar nichts... ;(
2.) Damit die Ladeanzeige korrekte Werte anzeigt, muss ich immer noch die 2 Byte für den Zeilenumbruch hinzufügen:
Code:
count += ((double)line.length() + 2) / 1024 / 1024;
3.) Mit jeder Datei, welche ich hereinziehe, wird ein neues Tab erstellt. Nun möchte ich mit den Pfeiltasten Nach-Links und Nach-Rechts zwischen den Tabs wechseln, auch wenn der Fokus auf der JList liegt. - Wie muss man hierfür vorgehen?
Ich würde auch gern das KeyBinding der JTabbedPane überschreiben, da hier original beim letzten Tab stets wieder auf den ersten gesprungen wird (und umgekehrt). Dieses Verhalten finde ich störend.
Es wäre sehr nett von euch, wenn sich jemand dieser Demo mal annehmen und mir weiterhelfen würde.
Hier ist meine Demo:
Java:
import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.*;
@SuppressWarnings("serial")
public class Demo extends JFrame {
// singleton variable
private static Demo m_instance;
private JTabbedPane m_TabsPane = null;
private JProgressBar m_progress = null;
private KeyListener m_keyListener = null;
private static final String APP_TITLE = "Demo";
private final int DEF_WIDTH = 800;
private final int DEF_HEIGHT = 600;
// constructor
public Demo() {
//-----------------------------------------------------------------------------
// Creating the tabbed pane
m_TabsPane = new JTabbedPane();
// Creating the progress bar
m_progress = new JProgressBar();
m_progress.setVisible(false);
// Adding the TabRowJacket
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(m_TabsPane, BorderLayout.CENTER);
this.getContentPane().add(m_progress, BorderLayout.SOUTH);
//-----------------------------------------------------------------------------
// define hot keys
m_TabsPane.addKeyListener( getArrowKeyListener() );
// for drag'n'drop feature
new FileDrop(this, new FileDrop.Listener() {
public void filesDropped(File[] files) {
if(files.length > 1) {
String msg = "Bitte nur eine Datei.";
JOptionPane.showMessageDialog(Demo.this, msg);
} else {
loadFile(files[0]);
}
}
});
// window should be centered on the primary monitor
Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
int posX = (int)(dim.getWidth()-DEF_WIDTH) / 2;
int posY = (int)(dim.getHeight()-DEF_HEIGHT) / 2;
this.setSize(DEF_WIDTH, DEF_HEIGHT);
this.setLocation(posX, posY);
// defining close operation
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public KeyListener getArrowKeyListener() {
if(m_keyListener == null) {
m_keyListener = new KeyListener() {
@Override public void keyTyped(KeyEvent ev) {}
@Override public void keyReleased(KeyEvent ev) {}
@Override
public void keyPressed(KeyEvent ev) {
switch(ev.getKeyCode()) {
case KeyEvent.VK_LEFT: Demo.this.prevTab();
case KeyEvent.VK_RIGHT: Demo.this.nextTab();
}
}
};
}
return m_keyListener;
}
//========================================================================================
// previous tab
public void prevTab() {
int index = m_TabsPane.getSelectedIndex();
if(index > 0) {
m_TabsPane.setSelectedIndex(index-1);
}
}
// next tab
public void nextTab() {
int index = m_TabsPane.getSelectedIndex();
if(index < m_TabsPane.getTabCount()-1) {
m_TabsPane.setSelectedIndex(index);
}
}
// loading file
private void loadFile(File logFile) {
if(logFile != null) {
double size = ((double)logFile.length()) / 1024 / 1024;
m_progress.setMaximum( (int)size );
this.setTitle( APP_TITLE + ": beim Laden..." );
JList newList = new JList();
newList.setModel( new DefaultListModel() );
newList.addKeyListener( getArrowKeyListener() );
m_TabsPane.add(logFile.getName(), newList);
try {
m_progress.setValue(0);
m_progress.setVisible(true);
BufferedReader in = new BufferedReader(new FileReader(logFile));
String line = null;
double count = 0;
int oldCount = 0;
while((line = in.readLine()) != null) {
((DefaultListModel) newList.getModel()).addElement(line);
count += ((double)line.length() + 2) / 1024 / 1024;
if(oldCount != (int)count) {
final int newValue = (int)count;
//System.out.println(count + " (Max=" + m_progress.getMaximum() + ")");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
m_progress.setValue(newValue);
}
});
Thread.sleep(100);
}
oldCount = (int)count;
}
//m_progress.setVisible(false);
} catch(Exception ex) {
String msg = "Beim Lesen der Datei ist folgender Fehler aufgetreten:\n" + ex.toString();
JOptionPane.showMessageDialog(this, msg);
return;
}
this.setTitle(APP_TITLE);
}
}
//========================================================================================
// singleton
public static Demo getInstance() {
if(m_instance == null) {
m_instance = new Demo();
}
return m_instance;
}
// main routine
public static void main(final String[] arg) throws IOException {
System.out.println("Java-Version: " + System.getProperty("java.version"));
try {
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
}
catch (ClassNotFoundException e) { e.printStackTrace(); }
catch (InstantiationException e) { e.printStackTrace(); }
catch (IllegalAccessException e) { e.printStackTrace(); }
catch (UnsupportedLookAndFeelException e) { e.printStackTrace(); }
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Demo win = Demo.getInstance();
win.setVisible(true);
if(arg.length > 0) {
win.loadFile(new File(arg[0]));
} else {
win.setTitle(APP_TITLE + ": Datei einfach hereinziehen");
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
});
}
}
[WR]Der Code benötigt die Klasse FileDrop[/WR]
Vielen Dank!!!