• Nenhum resultado encontrado

Η πρόσβαση στους καθορισμένους στόχους αρχίζει με το διευθυντή στόχου. Αυτό είναι ένα

γραφικό πρόσωπο διεπαφής που υποστηρίζει την επιλογή στόχου και την εισαγωγή των

παραμέτρων σύνδεσης βάσεων δεδομένων. Το σχήμα 12.1 παρουσιάζει τον διευθυντή στόχου με

τέσσερις καθορισμένους στόχους. Ο διευθυντής στόχου μας αποτελείται από δύο αρχικά

κομμάτια. Ο πρώτος, και πιο ενδιαφέρων των δύο, είναι TaskPanel κατηγορία που παρουσιάζεται

στη λίστα 12.6. Ο δεύτερος είναι η κατηγορία TaskManager που παρουσιάζεται στη λίστα 12.7.

Η κ α τη γο ρ ία T a sk P a n el, μ ε τη βοήθεια τρ ιώ ν εσω τερ ικ ώ ν κ α τη γο ρ ιώ ν τη ς, π α ρ έχ ει το ν όγκο τη ς διοικ η τικ ή ς διεπ α φ ή ς στόχου. Ο ι εσω τερ ικ ές κ α τη γορίες π ερ ιλ α μ β ά νο υ ν C on n ection Pa n e, T a sk P an e, κ α ι T a sk H a n d ler, π ου είνα ι α ρμ όδια για τη ν εισαγω γή π αρα μ έτρ ου σύ νδεση ς, τη ν επ ιλογή στόχου, κ α ι τη ν α π οστολή στόχου, αντίστοιχα. Η π τυχή C o n n ection P a n e sim ply επ ιτρ έπ ει τη ν εισαγω γή τω ν π λη ρ ο φ ο ρ ιώ ν π ου α π α ιτού ντα ι απ ό τη ν κ α τη γο ρ ία C o n n ectio n D a ta μας, δη λαδή ένα όνομ α κ α ι ένα όνομ α βά σεω ν δεδομ ένω ν, κ α ι ένα όνομ α χ ρή στη κ α ι ένας κ ω δικ ός π ρόσβα ση ς. Τ ο T a s k P a n e l π α ρ έχ ει ένα σύ νολο κ ου μ π ιώ ν για τη ν επ ιλογή στόχου. Ο α ριθμ ός τω ν κ ου μ π ιώ ν κ αι ο τρ ό π ο ς στου ς οπ οίους ονομ άζοντα ι, είναι βα σισμ ένοι στον κ ατά λογο στόχου π ου φ ο ρ τώ νετα ι ότα ν π ρ ο ω θ είτα ι η εφ α ρμ ογή μ ε ά λλα λόγια , τα κ ου μ π ιά στου ς στόχ ους π ου διευ κ ρ ινίζοντα ι στο α ρχείο δια μ όρφ ω ση ς. Η κ α τη γορ ία T a s k H a n d le r είναι ένα A c tio n L isten er α ρ μ όδιο γ ια το χ ειρ ισμ ό A c tio n E ve n ts π ου σ υ νδέετα ι μ ε τα κ ου μ π ιά στο T askP an e.

Ό τα ν ένας χ ρ ή σ τη ς χ τυ π ά σ ε ένα κ ου μ π ί στόχου, το T a s k H a n d le r ζη τά το α ντικ είμ ενο C o n n ection D ata π ου συ νδ έετα ι μ ε το C o n n ectio n P a n e κ α ι π ρ ο σ π α θ εί να χ τίσ ει μ ια σύ νδεση μ ε τη διευκ ρινισμ ένη βάση δεδομ ένω ν. Ε άν λ α μ β ά νει ένα έγκ υρο α ντικ είμ ενο σύνδεση ς, ζη τά έπ ειτα το ν κ α τά λογο στόχου κ αι επ α να λα μ β ά νει μ έσ ω του κ α τα λόγου ψ ά χ νοντα ς ένα α ντικείμ ενο T a s k D e fin itio n μ ε ένα όνομ α π ου τα ιρ ιά ζει μ ε ότι π α ρ εχ όμ ενο ς απ ό το ν στόχο κ ου μ π ιώ ν Ε άν ένα τα ίρ ια σ μ α T a s k D e fin itio n βρίσκεται, η α ντα νά κ λα ση χ ρ η σ ιμ ο π ο ιείτα ι για να λά β ει μ ια π ερίπ τω ση τη ς α ντίστοιχη ς κ α τη γο ρ ία ς εκπ ροσώ π ω ν. Τ ο α ντικ είμ ενο εκ π ρ ο σ ώ π ω ν π ετιέτα ι έπ ειτα σε ένα T a s k D e leg a te δεδομ ένου ότι αυτό είνα ι γ νω σ τό για να είνα ι ένας ο π ιο ελά χ ιστα κοινός π α ρο νο μ α σ τή ς γ ια όλες τις κ α τη γο ρ ίες εκπ ροσώ π ω ν. Τ έλος, η μ έθ οδ ο ς T a sk D eleg a te execu te() χ ρ η σ ιμ ο π ο ιείτα ι γ ια να α π ο σ τείλει το στόχο.

Τ ο δεύ τερο κ ομ μ ά τι του διευθυ ντή στόχου μας, η κ α τη γο ρ ία T a sk M a n a ger, είναι ο οδη γός εφ α ρμ ογή ς . Α να λ ύ ει το α ρχείο δια μ όρφ ω ση ς, χ τίζει το ν κ α τά λογο στόχου, κ αι π α ρ έχ ει το ν κ ύριο φ ρ α γμ ό π λα ισ ίω ν κ αι επ ιλογώ ν εφ αρμ ογή ς. Ε ξ ορισμ ού, α να μ ένει να βρει ένα δελτίο τρ ο φ ίμ ω ν ονομ α σ μ ένο α ρχείο ta sk s .c o n fc on fig u ra tio n εντού τοις, ένα ενα λλα σσ όμ ενο α ρχείο δια μ όρφ ω σ η ς μ π ο ρ εί να π α ρ α σ χ εθ εί μ έσ ω τη ς γρ α μ μ ή ς εντολής.

C o n n e ctio n D ata H o st N a m e : D a ta b a s e N a m e : P o rt N u m b e r:

U s e rn a m e : P a s s w o rd :

T a s k s ...

D a t a b a s e frrfo S h o w C olum n s

Insert Itow

Σ χ ή μ α 12.1 ο διευ θ υ ντή ς στόχου package mysqljava;

import java.awt.*;

import j ava.awt.event.*;

import java.sql.*;

import java.util.*;

import javax.swing.*;

import j avax.swing.border. *;

public class TaskPanel extends JPanel {

public TaskPanel( Tasks taskList ) {

this.taskList = taskList;

setLayout( new BorderLayout() );

connpane = new ConnectionPane();

connPane.setBorder( new TitledBorder( "Connection Data" ) );

taskpane = new TaskPane();

taskpane.setBorder( new TitledBorder( "T<O\sks" ) );

add( connPane, BorderLayout.NORTH );

add( taskPane, BorderLayout.SOUTH );

}

private Tasks taskList;

private Connectionpane connPane;

private TaskPane taskPane;

class ConnectionPane extends JPahel {

ConnectionPane () {

setLayout( new GridLayout( 5, );

add( hostNameLabel );

add ( hostNameField );

add( dbNameLabel );

add( dbNameField );

add ( portNumberLabel );

add( portNumberField );

add( usernameLabel );

add( usernameField );

add ( passwordLabel );

add( passwordField );

}

ConnectionData getConnectionData() {

String password = new String( passwordField.getPassword() );

ConnectionData data = new ConnectionData( hostNameField.getText(), dbNameField.getText() , portNumberField.getText() ,

usernameField.getText(), password ) ; return (data);

}

private JLabel hostNameLabel = new JLabel( "Host Name:" );

private JLabel dbNameLabel= new JLabel( "Database Name:" );

private JLabel portNumberLabel = new JLabel( "Port Number:" );

private JLabel usernameLabel = new JLabel( "Username:" );

private JLabel passwordLabel = new JLabel( "Password:" );

private JTextField hostNameField = new JTextField( 20 );

private JTextField dbNameField = new JTextField( 20 );

private JTextField portNumberField = new JTextField( "3306", 6 );

private JTextField usernameField= new JTextField( 20 );

private JPasswordField passwordField = new JPasswordField( 20 );

}

class T askPane extends JPanel {

TaskPane () {

int taskCount = TaskPanel.this.taskList.getTaskCountQ;

int rows = «(taskCount % COLS) == 0) ? (taskCount / COLS) «(taskCount / COLS)1);

setLayout( new GridLayout( rows, COLS ) );

add( passwordField );

}

ConnectionData getConnectionData() {

String password = new String( passwordField.getPassword() );

ConnectionData data = new ConnectionData( hostNameField.getText(), dbNameField.getText() , portNumberField.getText() ,

usernameField.getText(), password ) ; return (data);

}

private JLabel hostNameLabel = new JLabel( "Host Name:" );

private JLabel dbNameLabel= new JLabel( "Database Name:" );

private JLabel portNumberLabel = new JLabel( "Port Number:" );

private JLabel usernameLabel = new JLabel( "Username:" );

private JLabel passwordLabel = new JLabel( "Password:" );

private JTextField hostNameField = new JTextField( 20 );

private JTextField dbNameField = new JTextField( 20 );

private JTextField portNumberField = new JTextField( "3306", 6 );

private JTextField usernameField= new JTextField( 20 );

private JPasswordField passwordField = new JPasswordField( 20 );

}

class T askPane extends JPanel {

TaskPane () {

int taskCount = TaskPanel.this.taskList.getTaskCount();

int rows = «(taskCount % COLS) == 0)

? (taskCount / COLS)

«(taskCount / COLS) + 1);

setLayout( new GridLayout( rows, COLS ) );

JOptionpane.ERROR_MESSAGE );

return;

}

String taskName = ae.getActionCommand();

Enumeration tasks = taskList.getTasks();

boolean dispatched = false;

while ( tasks.hasMoreElements() ) {

TaskDefinition taskDef =(TaskDefinition) (tasks.nextElement(»;

if ( ! taskDef.isEnabled() ) {

continue;

}

if ( taskName.equals( taskDef.getName() ) ) {

try {

Class delegateClass = taskDef.getDelegate();

Object delegateObject = delegateClass.newInstance();

TaskDelegate delegate = (TaskDelegate)delegateObject; dispatched = delegate.execute-( conn);

if ( ! dispatched ) {

String msg = "Could not execute task: " + taskDef.getName();

JOptionpane.showMessageDialog(

Taskpanel.this, rusg,

"Task Failure", JOptionPane.ERROR_MESSAGE );

} }

catch( InstantiationException iX ) {

String rusg = "Failed to instantiate " + "delegate for task: "+ taskDef.getName();

JOptionPane.showMessageDialog(

TaskPanel.this, msg, "Task Failure", JOptionPane.ERROR_MESSAGE );

}

catch( IllegalAccessException iaX ) {

String msg _ "Cound not access delegate for task: " + taskDef.getName();

JOptionpane.showMessageDialog(

TaskPanel.this, msg, "Task Failure", JOptionpane.ERROR_MESSAGE );

} break;

} }

if ( ! dispatched ) {

try {

conn.close() ; }

catch ( SQLException sqlX ) {}

} } }

} , , , , , ,

Λ ί σ τ α 1 2 .6 Τ ο τμ ή μ α επ ιτροπ ή ς στόχου του διευθυ ντή στόχου:

package mysqljava;

import java.io.*;

import java.awt.*;

import j ava.awt.event.*;

import javax.swing.*;

import java.sql.*;

public class TaskManagerextends JFrame {

TaskManager( TaskstaskList ) {

super ( "MySQL-Java Task Manager" );

this.taskList = taskList;

buildGui () ;

pack() ;

setVisible( true );

}

private void buildGui() {

fileMenu.add( fileExit );

menuBar.add( fileMenu );

setJMenuBar( menuBar );

frameContainer.setLayout( new BorderLayout() );

frameContainer.add( new TaskPanel( taskList ) );

setContentPane( frameContainer ) ;

addWindowListener( new WindowHandler() );

fileExit.addActionListener( new MenuHandler() );

}

private JPanel frameContainer = new Jpanel();

private JMenuBar menuBar = new JMenuBar();

private JMenu fileMenu = new JMenu("File" );

private JMenuItem fileExit = new JMenuItem( "Exit" );

private Tasks taskList;

class WindowHandler extends WindowAdapter {

public void windowClosing( WindowEvent we ) {

System.exit( 0 );

} }

class MenuHandler implements ActionListener {

public void actionPerformed( ActionEventae ) {

if ( ae.getActionCommandO . equals ( "Exit" ) ) {

System. exit ( 0 )i }

} }

public static void main( String[] argS {

String configFileName = "tasks.conf'i if ( args.length == 1 )

{

configFileName = args[O];

}

File configFile = new File( configFileName) i if ( ! configFile.exists() II ! configFile.canR.ead() ) {

System.err.println( "Can't read config file + configFileName + ",OJ );

System. exit ( 1 )i }

FileReader configReader = null; try {

configReader = new FileReader(configFile }

catch ( FileNotFoundException fnfi ) {}

Tasks taskList = new Tasks ( configReader ); try {

configReader.close()i }

catch( IOException ioX ) {}

TaskManager ex = new TaskManager( taskList );

}} , , , , ,

Λ ί σ τ α 12. 7 Τ ο τμ ή μ α επ ιτρ οπ ή ς του διευθυ ντή στόχου:

Αποτελέσματα στόχου

Α π ό μ ια εφ α ρμ ογή ενδια φ ερόμ ενη για το υ ς βάση δ εδ ο μ ένω ν-σ χ ετικ ού ς στόχ ους σχ εδόν θα π α ρ α γά γει το υ λ ά χ ισ το ν μ ερ ικ ά α π οτελέσ μ α τα π ου επ ιδεικ νύ ο ντα ι κ α λύ τερ α μ ε το επ ιτρα π έζιο σχήμα, εμ είς τώ ρ α σ τρ έφ ο υ μ ε στην κ άλυ ψ η εκείνη ς τη ς ανάγκης. Μ έσω τη ς συ σκ ευ α σία ς τα λά ντευ σ ή ς της, η J a v a π α ρ έχ ει τη ν κομ ψ ή υπ οστή ρ ιξη για τη ν απ όδοση τω ν π ινάκω ν, και εκ μ ετα λλ ευ όμ α σ τε εκείνο το γ εγ ο νό ς εδώ. Α ρ χ ίζο υ μ ε μ ε τη ν επ έκ τα σ η τη ς κ α τη γο ρ ία ς

αφηρημένου

πίνακα προτύπου

(A b stra ctT a b leM od el) τη ς Java, όπ ω ς φ α ίνετα ι στη λ ίσ τα 12.8. Η π αρα γόμ ενη

κατηγορία μας, πίνακας προτύπου αποτελεσμάτων (ResultsTableModel), υποθέτει μια διανυσματική αντιπροσώπευση των επιτραπέζιων στοιχείων. Ο κατασκευαστής αναμένει ότι κάθε στοιχείο ενός παρεχόμενου διανύσματος είναι μια σειρά σειρών, με τον πρώτο περιέχοντας τα ονόματα στηλών και κάθε επόμενο στοιχείο αντιπροσωπεύοντας μια σειρά των στοιχείων. Η ευθύνη για κατάλληλες αντιπροσωπεύσεις σειράς για κάθε στοιχείο στηρίζεται με την οντότητα του πίνακα προτύπου αποτελεσμάτων (ResultsTableModel).

package mysgljava;

import java.util.*;

import javax.swing.table.*;

public class ResultsTableModel extends AbstractTableModel {

ResultsTableModel( Vector results) {

columnNames = (String)]) (results.get( 0 ));

results. remove ( 0 );

int rowCount = results.size();

tableData = new String [rowCount] [] ; for ( int i = 0; i < rowCount; ++i ) {

tableData[i] = (String)]) (results.get( i ));

} }

public String getColumnName( int collndex ) {

return (columnNames[colIndex]);

}

public int getColumnCount() {

return (columnNames.length);

}

public int getRowCount() {

return (tableData.length);

}

public Object getValueAt( int rowlndex, int collndex ) {

return (tableData[rowlndex] [collndex]);

}

private String[] columnNames;

private String [] [] tableData;

}

private String[] columnNames;

private String[] [] tableData;

} , , , , ,

Λ ί σ τ α 1 2 .8

Ύο πρότυπο που χρησιμοποιείται για την επίδειξη των αποτελεσμάτων με το επιτραπέζιο σχήμα

Με ένα πρότυπο σε ισχύ για τα επιτραπέζια στοιχεία μας, γυρίζουμε έπειτα στην επίδειξη εκείνου του στοιχείου. Η ευθύνη για τον πίνακα στηρίζεται με την κατηγορία πίνακας επιτροπής αποτελεσμάτων(ResultsTablePanel), η οποία παρουσιάζεται στη λίστα 12.9. Αν και κάπως περιορίζεται στη λειτουργία, παίρνει την εργασία. Οι στήλες είναι μεγέθους βασισμένες στο προσδοκώμενο μήκος επίδειξης των αντίστοιχων ονομάτων στηλών τους, και ο προκύπτων πίνακας τοποθετείται σε ένα πλακάκι κυλίνδρων. Πολύ περισσότερα μπορούν να γίνουν με τους πίνακες της Java, εντούτοις η διερεύνηση σε βάθος του πίνακα είναι πέρα από το πεδίο αυτού του βιβλίου.

package mysqljava;

import java. util . * ; import java. awt . * ; import javax. swing. * ; import javax. swing. table. * ;

public class ResultsTablePanel extends Jpanel {

public ResultsTablePanel ( Vector results) {

ResultsTableModel model = new ResultsTableModel( results);

JTable resultsTable = new JTable( model);

resultsTable.setAutoResizeMode( JTable.AUTO_RESIZE_OFF );

setColumnWidths( resultsTable );

JScrollPne resultsPana(resultsT able);

Dimension vieportSiZe =new Dimension ( PORT_WIDTH, PORT_HEIGHT ) ; resultSTable.setpreferredscrollableViewportSiZe( viewportSize ) ;

add ( resultspane ) ; }

private void setColumnwidthS( JTable table) {

TablecellRenderer renderer =table.getTableHeader() .getDefaultRenderer();

for ( int i=0; 1 < table.getcolumnCountcount(); ++1 ) {

TableColumn column= table.getcolumnModel().getColumn(i);

object headervalueobj =column.get1.Headervalue();

component headerComp =renderer.getTablecellRenderercomponent( table, headervalueObj, false, false, -1, i );

column. setpreferredWidth (

headercomp.getpreferredSize() .width ) ; }

}

final statiC private int PORT_WIDTH =600;

final static private int PORT_HEIGHT = 400;

}

} . , , ,

Λ ί σ τ α 1 2 .9 Η επ ιτρα π έζια επ ιτροπ ή α π οτελεσ μ ά τω ν

Τ ο τελικ ό συ στα τικ ό π ου π α ρ έχ ετα ι γ ια τη ν επ ίδειξη τω ν α π οτελεσ μ ά τω ν στόχου είνα ι η κ α τη γορία

πλαίσιο αποτελεσμάτων

(R esu ltsF ram e) π ου π α ρ ο υ σ ιά ζετα ι στη λ ίσ τα 12.10. Ό π ω ς το όνομ α υπ ονοεί, αυτή η κ α τη γο ρ ία π α ρ έχ ει ένα π λα ίσ ιο στο οπ οίο μ ια επ ιτροπ ή α π ο τελεσ μ ά τω ν μ π ο ρ εί να π αρεμ βλη θεί. Δ εν υπ ά ρ χ ει κ αμ ία α π α ίτη σ η ότι η επ ιτροπ ή π ερ ιέχ ει ένα ν π ίνα κ α π ου επ εκ τείνει η J a v a ’s J P a n el να είνα ι αποδεκτό. Ε κτός απ ό τη ν π α ρεχ όμ ενη επιτροπ ή, η κ α τη γο ρ ία π ρ οσθ έτει ένα γ ενικ ό κ ου μ π ί για το κ λείσ ιμ ο του π λα ισίου α π οτελεσμ ά τω ν.

package mysqljava;

import java.awt.*;

import j ava.awt.event.*;

import javax.swing.*;

public class ResultsFrame extends JFrame {

public ResultsFrame( String title, JPanel resultsPanel ) {

super ( title );

buildGui( resultsPanel );

pack () ;

setVisible( true );

}

private void buildGui ( JPanel resultspanel ) {

frameContainer.setLayout( new BorderLayout() );

frameContainer.add( resultsPanel, BorderLayout.NORTH );

closeButton. addActionListener ( new CloseHandler () );

frameContainer.add( closeButton, BorderLayout.SOUTH );

setContentPane( frameContainer );

}

private JPanel frameContainer = new JPanel();

private JButton closeButton = new JButton( "Close" );

class WindowHandler extends WindowAdapter {

public void windowClosing( WindowEvent we ) {

we. getWindow (). dispose () ; } }

class CloseHandler implements ActionListener {

public void actionPerformed( ActionEvent ae ) {

ResultsFrame.this.dispose() ; }

}

} , , , , ,

Λ ί σ τ α 1 2 .1 0 Έ να ς γ ενικ ό ς σκ οπ ός οδη γεί π λαίσιο

Ο στόχος πληροφοριών βάσεων δεδομένων

Έ χ ο υ μ ε τώ ρ α τα α π α ρα ίτη τα συ στα τικ ά σ ε ισχύ για τη ν υ π οστή ρ ιξη ενός απλού στόχου βάσεω ν δεδομ ένω ν, έτσι σ τρέψ τε τη ν π ροσοχή σας στη δη μ ιου ργία ενός τέτοιου στόχου. Ό π ω ς μ ε τις π ερ ισ σ ότερ ες εφ αρμ ογές, η π ρόσβα ση στις π λη ρ ο φ ο ρ ίες έκ δοση ς είνα ι συ χνά χ ρή σιμ η κ ατά κ α θ ορ ισ μ ό τη ς υ π ο σ τή ρ ιξη ς χ α ρ α κ τη ρ ισ τικ ώ ν γνω ρ ισ μ ά τω ν ή τη ν υπ οβ ολή εκ θ έσ εω ν τω ν π ροβλη μ ά τω ν. Η π αροχ ή μ ια ς σειρά ς έκ δοση ς για το π ρόσω π ο διεπ αφ ή ς θα ή τα ν μ ια τετριμ μ ένη π ροσθήκ η , α λλά τι γίνετα ι μ ε τη ν π ρόσβ α ση τω ν στοιχ είω ν έκδοση ς γ ια ένα ν ελλοχ εύ οντα κ εντρικ ό υπ ολογιστή M ySQ L, ή γ ια το ν οδη γό J D B C π ου επ ικ οινω νεί μ ε το ν κ εντρ ικ ό υπ ολογιστή ; Α υ τό η χ εί όπω ς μ ια ανα μ ονή στόχου για να συμβεί.

Η κ α τη γο ρ ία D b In fo π ου π α ρ ου σ ιά ζετα ι στη λ ίσ τα 12.11 χ ρ η σ ιμ εύ ει ω ς ο εκ π ρόσω π ος στόχου για το στόχο π λ η ρ ο φ ο ρ ιώ ν βάσεω ν δεδ ο μ ένω ν μας. Ό π ω ς απ α ιτείτα ι, εφ α ρμ όζει τη διεπ αφ ή T a s k D e leg a te κ α ι π α ρ έχ ει ένα ν ορισμ ό τη ς μ εθ όδου εκτέλεση ς εκείνη ς τη ς διεπ αφ ής. Η μ έθ οδος fin d D b In fo(), π ου κ άνει τη ν π ρ α γμ α τικ ή βάση δ εδομ ένω ν-σχ ετικ ή εργασία, χ ρ η σ ιμ ο π ο ιεί τη π α ρεχ όμ ενη σύνδεση α ντικειμ ένου γ ια να λ ά β ει ένα α ντικ είμ ενο D atab aseM etaD a ta . Τ ο α ντικ είμ ενο D a ta b a seM eta D a ta χ ρ η σ ιμ ο π ο ιείτα ι στη συ νέχ εια γ ια να λ ά β ει τις π λη ρ ο φ ο ρ ίες που είμ α σ τε κ ατόπ ιν. Ε ιδικότερα, το α ντικ είμ ενο μ ετα δ εδ ο μ ένω ν χ ρ η σ ιμ ο π ο ιείτα ι γ ια να α π οκ τή σει τις σειρές ονόμ ατος κ α ι έκ δοση ς για το π ρ ο ϊό ν βά σεω ν δ εδομ ένω ν κ αι το ν οδη γό JD B C σ α ν επίδομ α, ρ ίχ νο υ μ ε επ ίση ς στου ς μ εμ ονω μ ένο υ ς σ η μ α ντικ ού ς κ αι δευ τερ εύ ο ντες α ριθμ ού ς έκ δοση ς γ ια το ν οδη γό JD B C .

Μ ετά για να α π οκ τή σει τις π λη ρ οφ ορ ίες βά σεω ν δεδομ ένω ν, ο κ ώ δικ ά ς μ α ς συ νδυ ά ζει εκ είνες τις π λη ρ οφ ορ ίες μ ε τα κ α τά λ λ η λ α ο νόμ α τα στηλών, κ α ι σ υ σκ ευ ά ζει όλα επ ά νω σ ε ένα διάνυσμ α. Στο διά νυ σμ α χ ρ η σ ιμ ο π ο ιείτα ι ένας π ίνα κ α ς επ ιτρ οπ ή ς α π οτελεσ μ ά τω ν(R esu ltsT a b leP a n el), το οποίο π α ρ εμ β ά λ λετα ι έπ ειτα σε ένα π λα ίσιο α π ο τελεσ μ ά τω ν (R esu ltsF ram e) κ α ι επ ιδεικ νύ ετα ι για το χρήστη. Έ ν α π α ρ ά δ ειγμ α του π λα ισίου α π ο τελεσ μ ά τω ν π α ρ ο υ σ ιά ζετα ι στο σχή μ α 12.2.

package mysqljava;

import java.util.*;

import java.sql.*;

public class DbInfo implements TaskDelegate {

public DbInfo () {}

public boolean execute ( Connection conn) {

if ( findDbInfo( conn) } {

ResultsTablePanel results =new ResultsTablePanel( resultsTable };

new ResultsFrame( "Database Information", results);

return (true);

}

return (false);

}

private boolean findDbInfo( Connection conn) {

String[] columnNames = new String [COLS];

columnNames[O] = "DB Product Name";

columnNames[l] = "DB Product Version";

columnNames[2] = "Driver Name";

columnNames[3] = "Driver Version String";

columnNames[4] = "Driver Major Version";

columnNames[5] = "Driver Minor Version";

resultsTable.add( columnNames );

try {

DatabaseMetaData metaData = conn.getMetaData();

String[] values = new String [COLS];

values [0] = metaData.getDatabaseProductName();

values [1] = metaData.getDatabaseProductVersion();

values [2] = metaData.getDriverName();

values [3] = metaData.getDriverVersion();

values [4] = String.valueOf(

metaData.getDriverMajorVersion() );

values [5] = String.valueOf( metaData.getDriverMinorVersion() );

resultsTable.add( values );

}

catch( SQLException sqlX )

{

System.out.println( SglExceptionReader.readException( sglX ) );

return (false);

}

return (true);

}

private Vector resultsTable = new Vector();

private final static int COLS = 6;

Λ ί σ τ α 1 2.11 ο εκ π ρόσω π ος στόχου π λ η ρ ο φ ο ρ ιώ ν βά σεω ν δεδομ ένων:

Σ χ ή μ α 1 2 .2 Τ ο π λα ίσιο α π οτελεσ μ ά τω ν του στόχου π λ η ρ ο φ ο ρ ιώ ν βά σεω ν δ εδομ ένω ν

Εισαγωγή χρηστών για τους στόχους

Χ ω ρ ίς π αροχ ή του χ ρή στη τη ν ευκ α ιρία να π α ρ α σ χ εθ ο ύ ν οι π ρό σ θ ετο ι μ ετρ η τές εισαγω γής, π ερ ιο ρ ίζο υ μ ε το ν α ριθ μ ό χ ρ ή σ ιμ ω ν στόχ ω ν π ου μ π ο ρ ο ύ ν να υ π ο σ τη ρ ιχ θ ο ύ ν απ ό το π ρ ό σ ω π ο διεπ αφ ή ς μας. Υ π ό α υ τή ν τη μ ορφ ή, εκ μ ετα λ λ ευ όμ α σ τε α υ τή ν τη ν ευ κ α ιρία να π ρ ο σ θ έσ ου μ ε τη ν κ α τη γο ρ ία π λα ισίου υ π α γό ρ ευ σ η ς (P rom ptF ram e) π ου π α ρ ο υ σ ιά ζετα ι στη λίστα 12.12. Α υ τή η κ α τη γο ρ ία είναι σα ν τη ν κ α τη γο ρ ία R esu ltsF ra m e μας, μ ε το κ ύ ριο χ α ρ α κ τη ρ ισ τικ ό γνώ ρ ισ μ α διά κ ρισ η ς π ου είνα ι π ρόσθ ετη ευ ελιξία όσον α φ ορά το κ ου μ π ί του π λαισίου. Σ τη ν π ερίπ τω σ η του P rom ptF ram e, το α ντικ είμ ενο δ ιευ κ ρ ινίζει το όνομ α του κ ου μ π ιού κ αι το σχ ετικ ό χειριστή δράσης. Α υ τό π α ρ έχ ει τη ν υ π οστή ρ ιξη κ α ι για τις υ π α γο ρ εύ σ εις κ α ι για τις π ερ ιπ τώ σ εις συ νή θ εια ς όπου οι α π α ρα ίτη τες π λη ρ οφ ορ ίες α π α ιτού ν τις π ολ λα π λά σιες υ π α γορεύσεις.

package mysqljava;

import java.awt.*;

import j ava.awt.event.*;

import javax.swing.*;

public class Prompt Frame extends JFrame {

public Prompt Frame ( String title, String promptLabel, JPanel prompt Panel , ActionListener pJComptHandler ) {

super ( title );

buildGui( promptLabel, promptPanel, promptHandler );

pack: () ;

setVisible( tJCue );

}

private void buildGui( String promptLabel,

JPanel promptPanel, ActibhLi$tener promptHandler ) {

frameContai!).eJC.setLayout( new BorderLayout() );

frameContainer.add( promptPanel, BorderLayout.NORTH );

JButton promptButton = new JButton( promptLabel );

promptButton. addActionListener ( promptHandler ) ; promptButton.addActionListener(neW CloseHandler() );

frameContainer.add( promptButto!)., BorderLayout.SOUTH );

set Content Pane ( frameContainer );

}

private Jpanel frameContainer = new Jpanel () ; class WindowHandler extends wi!).dowAdapter {

public void windowClosing( WindowEvent we ) {

we.getWindow() .dispose();

} }

class CloseEandler implements ActionListener {

public voidactionPerformed( ActionEve!).t ae )

{

PromptFrame.this. dispose();

} }

} , , , , , , ,

Λ ί σ τ α 1 2 .1 2 Μ ια γενικ ή κ α τη γο ρ ία π λ α ισ ίω ν γ ια τις επ ιτροπ ές εισ α γω γή ς χρηστώ ν: