Für ein Datenbank-GUI habe ich drei Klassen (bis jetzt).
Edda.java
Gui.java
Und DbOperations.java
Was super funktioniert (dank Hilfe in diesem Thread) ist, die JTextArea 'area' zu append()en. Allerdings nur aus der main(), die ich eigentlich möglichst kurz und frei halten wollte.
Was ich jetzt vorhatte ist, einen String[] (der später aus der Datenbank kommen soll) in eine ArrayList zu wandeln (funktioniert) und dann Zeile für Zeile an die JTextArea in der Gui-Instanz gui anzuhängen.
So wie ich es jetzt habe, werden natürlich zwei GUIs erstellt, im ersten erscheint der append()ete Text aus der main() (bzw. db.dbReturn), im zweiten der aus der strArrToGui(). Das soll natürlich so nicht sein, ich habe aber keine Ahnung (und auch nichts gefunden), wie ich die in der main() instanziierte gui ansprechen kann um ihr per setText("...") was zu übergeben.
Natürlich könnte ich genau wie bei db.dbReturn einen String von strArrToGui() zurückgeben lassen, aber da dies nur die erste von vielen zu implementierenden Methoden (und der, bei der ich wohl alles lernen muss
) ist, möchte ich das möglichst vermeiden.
Danke für Vorschläge, Code-Fixes, etc. im Voraus!
Edda.java
Java:
package edda;
import java.util.*;
public class Edda {
static Gui gui;
public static void main(String[] args) {
DbOperations db = new DbOperations();
db.loadDbDriver();
Gui gui = new Gui(null);
gui.setText("Hi!\n\n");
gui.setText(db.dbReturn); // append()ed die Rückgabestrings der loadDbDriver Methode an die JTextArea 'area'
/* Test: Drucke eine Zeile der Tabelle auf eine Zeile in der GUI, formatiert! */
db.strArrToGui(null);
}
}
Gui.java
Java:
package edda;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
@SuppressWarnings("serial")
public class Gui extends JFrame {
/* Class Variables */
private JTextArea area; //Holds the data for text
/**
* @param textVal Text parameter for output JTextArea 'area'
*/
public Gui (String textVal)
{
super("Titel");
//Create and set up the window.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Create and set up the content pane.
setJMenuBar(createMenuBar());
setContentPane(createContentPane());
// Display JTextArea for Output
area = new JTextArea();
area.setEditable(false);
area.append(getText());
getContentPane().add(area);
//Display the window.
pack();
setExtendedState(getExtendedState()|JFrame.MAXIMIZED_BOTH);
setVisible(true);
}//end constructor Gui
/**
* @return JMenuBar
*/
public JMenuBar createMenuBar() {
JMenuBar menuBar;
JMenu menu, submenu;
JMenuItem menuItem;
//Create the menu bar.
menuBar = new JMenuBar();
//Build the first menu.
menu = new JMenu("A Menu");
menu.setMnemonic(KeyEvent.VK_A);
menu.getAccessibleContext().setAccessibleDescription("The only menu in this program that has menu items");
menuBar.add(menu);
//a group of JMenuItems
menuItem = new JMenuItem("A text-only menu item",KeyEvent.VK_T);
//menuItem.setMnemonic(KeyEvent.VK_T); //used constructor instead
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_6, ActionEvent.ALT_MASK));
menuItem.getAccessibleContext().setAccessibleDescription("This doesn't really do anything");
menu.add(menuItem);
//a submenu
menu.addSeparator();
submenu = new JMenu("A submenu");
submenu.setMnemonic(KeyEvent.VK_S);
menuItem = new JMenuItem("An item in the submenu");
menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_2, ActionEvent.ALT_MASK));
submenu.add(menuItem);
menuItem = new JMenuItem("Another item");
submenu.add(menuItem);
menu.add(submenu);
return menuBar;
} // end method createMenuBar
/**
* Creates the content pane for the menu bar
* @return contentPane
*/
public Container createContentPane() {
//Create the content-pane-to-be.
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setOpaque(true);
//Create a scrolled text area.
area = new JTextArea(5, 30);
area.setEditable(false);
area.append(getText());
JScrollPane scrollPane = new JScrollPane(area);
//Add the text area to the content pane.
contentPane.add(scrollPane, BorderLayout.CENTER);
return contentPane;
} // end method createContentPane
/* Setters & Getters */
/**
* @return Text for output JTextArea area
*/
public String getText ( )
{
return area.getText();
}//end method getText
/**
* @param textVal String parameter for output JTextArea 'area'
*/
public void setText (String textVal)
{
area.append(textVal);
}//end method setText
}
Und DbOperations.java
Java:
/**
* Includes database operations: driver, connections, queries
*/
package edda;
import java.sql.*;
import java.util.*;
public class DbOperations extends Edda {
Connection con;
Statement stmt;
String loadStr;
String connectStr;
String dbReturn;
String[] strArr;
/**
* Loads the database driver and connects to the database
* @return dbErrors String Array mit Rückgaben
*/
public String loadDbDriver() {
/** Load driver */
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
loadStr = "Driver successfully loaded.";
}
catch (ClassNotFoundException e)
{
System.exit (0);
}
/** Connect to DB*/
try
{
con = DriverManager.getConnection( "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/-----------------------------------");
connectStr = "Connection to database established.";
}
catch ( SQLException e )
{
e.printStackTrace();
}
dbReturn = loadStr + "\n" + connectStr;
return dbReturn;
} // end loadDbDriver
public String[] printTable(){
String[] strArr = {"a","b","c"}; // Wird später String[] aus DB Abfragen ResultSet
return strArr;
}
public void strArrToGui (String[] arr1){
Gui gui2 = new Gui(null);
arr1 = printTable();
List<String> arrList = Arrays.asList(arr1);
for (String lstStr : arrList){
gui2.setText(lstStr);
}
}
} // endclass
Was super funktioniert (dank Hilfe in diesem Thread) ist, die JTextArea 'area' zu append()en. Allerdings nur aus der main(), die ich eigentlich möglichst kurz und frei halten wollte.
Was ich jetzt vorhatte ist, einen String[] (der später aus der Datenbank kommen soll) in eine ArrayList zu wandeln (funktioniert) und dann Zeile für Zeile an die JTextArea in der Gui-Instanz gui anzuhängen.
So wie ich es jetzt habe, werden natürlich zwei GUIs erstellt, im ersten erscheint der append()ete Text aus der main() (bzw. db.dbReturn), im zweiten der aus der strArrToGui(). Das soll natürlich so nicht sein, ich habe aber keine Ahnung (und auch nichts gefunden), wie ich die in der main() instanziierte gui ansprechen kann um ihr per setText("...") was zu übergeben.
Natürlich könnte ich genau wie bei db.dbReturn einen String von strArrToGui() zurückgeben lassen, aber da dies nur die erste von vielen zu implementierenden Methoden (und der, bei der ich wohl alles lernen muss
Danke für Vorschläge, Code-Fixes, etc. im Voraus!