pomoce do appletów


Programowanie obiektowe /Java/
Wyświetlanie plików graficznych w aplecie
import java.awt.*;
import javax.swing.*;
class Board extends JComponent {
private Image image;
Board(Image image) {
this.image = image;
}
@Override
public void paintComponent(Graphics g) {
if (image != null)
g.drawImage(image, 100, 100, this);
}
}
Metoda 1:
import java.awt.*;
import java.net.*;
import javax.swing.*;
public class MyApplet extends JApplet {
@Override
public void init(){
this.setSize(640, 480);
URL url = this.getClass().getResource("/obrazek1.jpg");
Image image = this.getImage(url);
this.add(new Board(image));
}
}
Metoda 2:
import java.awt.*;
import java.net.*;
import javax.swing.*;
public class MyApplet extends JApplet {
@Override
public void init(){
this.setSize(640, 480);
try {
URL url = new URL(this.getCodeBase() + "/obrazek2.jpg");
Image image = this.getImage(url);
this.add(new Board(image));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
Kompilacja:
javac *.java
Utworzenie archiwum jar zawierającego skompilowane klasy oraz pliki graficzne:
jar -cvf MyApplet.jar *.class *.jpg
Fragment strony w formacie html (np. index.html):


Uruchamianie apletu, wykorzystującego sieć, przy pomocy przeglądarki
Aplet:
import java.net.Socket;
import javax.swing.JApplet;
public class MyApplet extends JApplet {
@Override
public void init() {
this.setSize(640, 480);
String host = this.getDocumentBase().getHost();
try {
Socket socket = new Socket(host, 54321);
socket.getOutputStream().write(123);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Serwer:
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception{
ServerSocket server = new ServerSocket(54321);
Socket socket = server.accept();
System.out.println(">>> " + socket.getInputStream().read());
}
}
Archiwum jar:
jar -cvf MyApplet.jar *.class
Strona html:


Bardzo często zdarza się, że jeżeli uruchomimy apletem i serwer przy pomocy środowiska
programistycznego (np. Eclipse) wszystko działa poprawnie a podczas uruchomienia apletu przez
przeglądarkę komunikacja sieciowa nie działa pomimo tego, że aplet i serwer są na tym samym
komputerze.
Ustawienia Eclipse można znalezć w pliku:
java.policy.applet
Zazwyczaj ma on następującą zawartość:
grant {
permission java.security.AllPermission;
};
Po uruchomieniu apletu w przeglądarce należy obejrzeć standardowe wyjście błędów w Java
Console (w systemie Windows do Java Console można dostać się poprzez małą ikonę Javy
znajdująca się koło zegara). Brak możliwości połączenia objawia się następująco:
java.security.AccessControlException: access denied (java.net.SocketPermission
127.0.0.1:54321 connect,resolve) ...
W celu udzielenia pozwolenia na to połączenie należy:
1. Ustalić, które jre jest wykorzystywane przez przeglądarkę (w Java Console wyświetla się jego
wersja) np. jre 1.6, która znajduje się np. w katalogu C:\Program Files\Java\jre1.6.0\
Czasem w systemie może być więcej niż jedno jre np.
C:\Program Files\Java\jre1.6.0\ oraz C:\Program Files\Java\jdk1.6.0\jre1.6.0\
2. W podkatalogu lib\security znajdujemy plik java.policy.
3. Na końcu pliku dodajemy:
grant {
permission java.net.SocketPermission "127.0.0.1:54321", "connect,resolve";
};
Innym rozwiązaniem jest instalacja serwera www np. Apache i uruchamianie strony przez niego
np. http://localhost/applet/index.html.
Dokumentacja w formacie Javadoc.
W dokumentacji można stosować kod html.
Przykład:
import java.io.FileNotFoundException;
import javax.swing.JFrame;
/**
* This is my class.
* @see java.lang.Thread
* @see java.lang.Thread#run()
* @version 1.0
* @author Author
* @since JDK1.4
*/
public class Javadoc extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* This is my attribute.
*/
public int attribute;
/**
* This is my thread.
*/
private Thread t;
/**
* @deprecated
* @param i III...
* @return RRR...
* @throws FileNotFoundException EEE...
*/
int init(int i) throws FileNotFoundException {
t = new Thread();
t.start();
return 0;
}
}
Najczęściej stosowane znaczniki*:
- @see - odwołanie do dokumentacji innej klasy,
- @version - informacja o wersji,
- @author - informacja o autorze,
- @since - informacja o wersji Javy, w której rozpoczęto stosowanie danej właściwości,
- @param - opis parametru metody,
- @return - opis wyniku zwracanego przez metodę,
- @throws - informacja o wyjątkach zgłaszanych przez metodę,
- @deprecated - oznaczenie niezalecanej właściwości.
Generowanie dokumentacji:
np. javadoc -private -d doc *.java
* Thinking in Java, Bruce Eckel, Wydanie IV, Helion, 2006
Przykład obsługi zdarzeń pochodzących od myszy. Po kliknięciu rysunek zmienia się. Po usunięciu
komentarz widać w jaki sposób rysunek został narysowany.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test {
public static void test() {
JFrame f = new JFrame();
f.setSize(640, 480);
f.add(new MyBoard());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
test();
}
});
}
}
class MyBoard extends JComponent {
private boolean state;
public MyBoard() {
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
state = !state;
repaint();
}
});
}
@Override
public void paintComponent(Graphics g) {
final int width = this.getWidth() / 2;
final int height = this.getHeight() / 2;
final int eyeWidth = width / 10;
final int eyeHeight = height / 10;
g.drawArc(width / 4 * 3 - eyeWidth / 2,
height / 4 * 3 - eyeHeight / 2, eyeWidth, eyeHeight, 0, 360);
g.drawArc(width / 4 * 5 - eyeWidth / 2,
height / 4 * 3 - eyeHeight / 2, eyeWidth, eyeHeight, 0, 360);
g.drawArc(width / 2, height / 2, width, height, 0, 360);
if (state)
g.drawArc(width / 4 * 3,
height / 4 * 3, width / 2, height / 2, 180, 180);
else
g.drawArc(width / 4 * 3,
height, width / 2, height / 2, 0, 180);
/*
g.drawLine(width, 0, width, height * 2);
g.drawLine(width / 2, 0, width / 2, height * 2);
g.drawLine(width / 4 * 3, 0, width / 4 * 3, height * 2);
g.drawLine(width / 2 * 3, 0, width / 2 * 3, height * 2);
g.drawLine(width / 4 * 5, 0, width / 4 * 5, height * 2);
g.drawLine(0, height, width * 2, height);
g.drawLine(0, height / 2, width * 2, height / 2);
g.drawLine(0, height / 4 * 3, width * 2, height / 4 * 3);
g.drawLine(0, height / 2 * 3, width * 2, height / 2 * 3);
g.drawLine(0, height / 4 * 5, width * 2, height / 4 * 5);
*/
}
}
Przykład obsługi zdarzeń pochodzących od myszy i klawiatury. Lewym klawiszem myszy można
przeciągać pionek pomiędzy polami. Przy pomocy klawiatury można przesuwać pionek (strzałki
lub klawisze ASDW) oraz zmieniać losowo jego kolor (Spacja).
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class Test {
public static void test() {
JFrame f = new JFrame();
f.setSize(640, 480);
f.add(new MyBoard());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
test();
}
});
}
}
class MyBoard extends JComponent {
private static final int MIN_X = 0;
private static final int MIN_Y = 0;
private static final int MAX_X = 3;
private static final int MAX_Y = 3;
private float x = MAX_X, y = MAX_Y;
private Color c = null;
private boolean marked = false;
private int width;
private int height;
private int stepX;
private int stepY;
private int border;
private int doubleBorder;
private Random r = new Random();
public MyBoard() {
setFocusable(true);
requestFocus();
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
if ((e.getModifiers () & MouseEvent.BUTTON1_MASK) == 0)
return;
x = (float) e.getX() / stepX - 0.5f;
if (x > MAX_X)
x = MAX_X;
if (x < MIN_X)
x = MIN_X;
y = (float) e.getY() / stepY - 0.5f;
if (y > MAX_Y)
y = MAX_Y;
if (y < MIN_Y)
y = MIN_Y;
repaint();
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
repaint();
}
@Override
public void mouseReleased(MouseEvent e) {
x = e.getX() / stepX;
y = e.getY() / stepY;
repaint();
}
});
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_A
|| keyCode == KeyEvent.VK_LEFT) {
if (x > 0)
--x;
} else if (keyCode == KeyEvent.VK_D
|| keyCode == KeyEvent.VK_RIGHT) {
if (x < MAX_X)
++x;
} else if (keyCode == KeyEvent.VK_W
|| keyCode == KeyEvent.VK_UP) {
if (y > 0)
--y;
} else if (keyCode == KeyEvent.VK_S
|| keyCode == KeyEvent.VK_DOWN) {
if (y < MAX_Y)
++y;
} else {
marked = !marked;
setNewColor();
}
repaint();
}
});
}
@Override
public void paintComponent(Graphics g) {
width = this.getWidth();
height = this.getHeight();
stepX = width >> 2;
stepY = height >> 2;
border = 5;
doubleBorder = border << 1;
for (int i = 0; i < MAX_X + 1; i++)
g.drawLine(i * stepX, 0, i * stepX, height);
for (int i = 0; i < MAX_Y + 1; i++)
g.drawLine(0, i * stepY, width, i * stepY);
if (c != null){
g.setColor(c);
g.fillArc((int)(x * stepX + border),
(int)(y * stepY + border),
width / 4 - doubleBorder,
height / 4 - doubleBorder, 0, 360);
}
else
g.drawArc((int)(x * stepX + border),
(int)(y * stepY + border),
width / 4 - doubleBorder,
height / 4 - doubleBorder, 0, 360);
}
private void setNewColor() {
c = new Color(r.nextInt(256), r.nextInt(256), r.nextInt(256));
}
}
Gradient
Po uruchomieniu aplikacji należy wybrać cztery różne kolory na podstawie, których mają być
utworzone gradienty.
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RadialGradientPaint;
import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JFrame;
public class Test {
public static void test() {
JFrame f = new JFrame();
f.setSize(640, 480);
Color color1 = Color.YELLOW;
Color color2 = Color.RED;
Color color3 = Color.BLACK;
Color color4 = Color.BLUE;
Color tmp = null;
tmp = JColorChooser.showDialog(f, "Color1", Color.YELLOW);
if(tmp != null)
color1 = tmp;
tmp = JColorChooser.showDialog(f, "Color2", Color.RED);
if(tmp != null)
color2 = tmp;
tmp = JColorChooser.showDialog(f, "Color3", Color.BLACK);
if(tmp != null)
color3 = tmp;
tmp = JColorChooser.showDialog(f, "Color4", Color.BLUE);
if(tmp != null)
color4 = tmp;
f.add(new MyGradient(color1, color2, color3, color4));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
test();
}
});
}
}
class MyGradient extends JComponent {
Color color1;
Color color2;
Color colors[];
MyGradient(Color color1, Color color2, Color color3, Color color4) {
this.color1 = color1;
this.color2 = color2;
this.colors = new Color[] { color3, color4 };
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.translate(getWidth() / 2, getHeight() / 2);
GradientPaint gp = new GradientPaint(
-getWidth() / 2, -getHeight() / 2, color1,
-getWidth() / 2, getHeight() / 2, color2);
g2d.setPaint(gp);
g2d.fillRect(-getWidth() / 2, -getHeight() / 2,
getWidth(), getHeight());
int s = (getWidth() + getHeight()) / 6;
RadialGradientPaint rgp = new RadialGradientPaint(0, 0, s,
new float[] { 0.5f, 1.0f }, colors);
g2d.setPaint(rgp);
g2d.fillArc(-s, -s, s * 2, s * 2, 0, 360);
}
}
Przezroczystość
Po uruchomieniu aplikacji należy podać poziom przezroczystości z zakresu od 0.0 do 1.0.
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Test {
public static void test() {
JFrame f = new JFrame();
f.setSize(640, 480);
String t = JOptionPane.showInputDialog(f,
"Enter transparency between 0.0 to 1.0");
float value = 0.5f;
try {
value = new Float(t);
} catch (Exception ignore) {
}
f.add(new MyBoard(value));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
test();
}
});
}
}
class MyBoard extends JComponent {
private static final int MAX_X = 3;
private static final int MAX_Y = 3;
private static final int MIN_X = 0;
private static final int MIN_Y = 0;
private float value;
private float x, y;
private boolean paintFinal = true;
int width, height;
int stepX, stepY;
int border, doubleBorder;
public MyBoard(float value) {
this.value = value;
addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
if (paintFinal == false) {
x = (float) e.getX() / stepX - 0.5f;
if (x > MAX_X)
x = MAX_X;
if (x < MIN_X)
x = MIN_X;
y = (float) e.getY() / stepY - 0.5f;
if (y > MAX_Y)
y = MAX_Y;
if (y < MIN_Y)
y = MIN_Y;
repaint();
}
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
int tmpX = e.getX() / stepX;
int tmpY = e.getY() / stepY;
if (tmpX == x && tmpY == y) {
paintFinal = false;
repaint();
}
}
@Override
public void mouseReleased(MouseEvent e) {
if (paintFinal == false) {
paintFinal = true;
x = e.getX() / stepX;
if (x > MAX_X)
x = MAX_X;
if (x < MIN_X)
x = MIN_X;
y = e.getY() / stepY;
if (y > MAX_Y)
y = MAX_Y;
if (y < MIN_Y)
y = MIN_Y;
repaint();
}
}
});
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
Paint p = g2d.getPaint();
GradientPaint gp = new GradientPaint(0, 0, Color.YELLOW, getWidth(),
getHeight(), Color.BLACK);
g2d.setPaint(gp);
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setPaint(p);
width = this.getWidth();
height = this.getHeight();
stepX = width >> 2;
stepY = height >> 2;
border = 5;
doubleBorder = border << 1;
for (int i = 0; i < 4; i++)
g2d.drawLine(i * stepX, 0, i * stepX, height);
for (int i = 0; i < 4; i++)
g2d.drawLine(0, i * stepY, width, i * stepY);
g2d.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, value));
g2d.fillArc((int) (x * stepX + border), (int) (y * stepY + border),
width / 4 - doubleBorder, height / 4 - doubleBorder, 0, 360);
}
}
Prosty przykład użycia tabel. W Javie można tworzyć bardzo zaawansowane tabele. Istnieje
m.in. możliwość:
- sortowania,
- dodania różnych edytorów dla poszczególnych komórek np. list rozwijanych lub dodatkowych
okien dialogowych,
- zmiany sposobu wyświetlania poszczególnych komórek np. zmienne typy boolean mogą być
wyświetlane jako:;&i :&.
Uwaga!!! Przed uruchomieniem należy usunąć komentarz z jednej z wybranych linii.
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
public class Test {
public static void test() {
String[] kolumny = { "Nazwisko", "Imię" };
Object[][] dane = { { "Kowalski", "Jan" },
{ "Malinowski", "Karol" } };
final JFrame f = new JFrame();
f.setSize(800, 600);
// Uwaga!!! nalezy usunąć komentarz z jednej z poniższych lini
// final JTable t = new JTable(dane, kolumny);
// lub
// final JTable t = new JTable(new MyTableModel(kolumny, dane));
final JPanel p = new JPanel();
p.setLayout(new BorderLayout());
final JButton wyswietl = new JButton("Wy\u015Bwietl");
wyswietl.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String w = JOptionPane.showInputDialog(f,
"Podaj numer wiersza:");
int wiersz = -1;
try {
wiersz = Integer.parseInt(w);
} catch (Exception ignore) {
}
if (wiersz != -1) {
if (wiersz < t.getRowCount())
JOptionPane.showMessageDialog(f,
t.getValueAt(wiersz, 0) + ":" +
t.getValueAt(wiersz, 1));
}
}
});
p.add(wyswietl, BorderLayout.NORTH);
p.add(new JScrollPane(t), BorderLayout.CENTER);
f.add(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
test();
}
});
}
}
class MyTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;
private String[] columns;
private Object[][] data;
MyTableModel(String[] columns, Object[][] data) {
this.columns = columns;
this.data = data;
}
public String getColumnName(int column) {
if (column == 0)
return "Lp.";
return columns[column - 1];
}
public int getRowCount() {
return data.length;
}
public int getColumnCount() {
return columns.length + 1;
}
public Object getValueAt(int row, int column) {
if (column == 0)
return row;
return data[row][column - 1];
}
public boolean isCellEditable(int row, int column) {
if (column == 0)
return false;
return true;
}
public void setValueAt(Object value, int row, int column) {
if (column == 0)
return;
data[row][column - 1] = value;
fireTableCellUpdated(row, column);
}
}
Przykład oddzielenia części aplikacji odpowiadającej za wyświetlanie (klasa MainPanel) od część
odpowiadającej za logikę aplikacji (klasa ApplicationLogic).
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Test {
public static void test() {
final JFrame f = new JFrame();
f.setSize(800, 600);
final MainPanel p = new MainPanel();
p.addObserver(new ApplicationLogic(f));
f.add(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
test();
}
});
}
}
final class ApplicationLogic implements Observer{
private JFrame f;
ApplicationLogic(JFrame f){
this.f = f;
}
@Override
public void update(Observable obs, Object arg) {
if (arg instanceof ActionEvent) {
ActionEvent e = (ActionEvent) arg;
Object o = e.getSource();
if (o instanceof JButton) {
JButton b = (JButton) o;
System.out.println("JButton:" + b.getText()
+ ":" + b.getActionCommand());
String s = JOptionPane.showInputDialog(f,
"Old text: " + b.getText() +
" New text: ???");
if (s != null)
b.setText(s);
}
}
}
}
final class MainPanel extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private MyObservable observable;
private JButton[] buttons;
public MainPanel() {
observable = new MyObservable();
setLayout(new FlowLayout());
buttons = new JButton[59];
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton("" + (char) (i + 64));
buttons[i].addActionListener(this);
add(buttons[i]);
}
}
@Override
public void actionPerformed(ActionEvent e) {
observable.setChanged();
observable.notifyObservers(e);
observable.clearChanged();
}
final public void addObserver(Observer o) {
observable.addObserver(o);
}
final public void deleteObserver(Observer o) {
observable.deleteObserver(o);
}
final private static class MyObservable extends Observable {
final public void setChanged() {
super.setChanged();
}
final public void clearChanged() {
super.clearChanged();
}
}
}


Wyszukiwarka

Podobne podstrony:
NCBI pomoce do pracy
Pomoce do listy 2 dzienne
pozwol mi przyjsc do ciebie
wytyczne do standar przyl4
FAQ Komendy Broń (Nazwy używane w komendach) do OFP
Drzwi do przeznaczenia, rozdział 2
53$2403 specjalista do spraw szkolen
Do W cyrkulacja oceaniczna II rok
powod do rozwodu (2)

więcej podobnych podstron