|
Java состоит из двух групп данных типов, примитивных типов данных и ссылок на объекты.
Java Primitive Data Types
| Data Type |
Purpose |
Contents |
Default Value* |
| boolean |
Truth value |
true or false |
fales |
| char |
Character |
Unicode characters |
\u0000 |
| byte |
Signed integer |
8 bit two's complement |
(byte) 0 |
| short |
Signed integer |
16 bit two's complement |
(short) 0 |
| int |
Signed integer |
32 bit two's complement |
0 |
| long |
Signed integer |
64 bit two's complement |
0L |
| float |
Real number |
32 bit IEEE 754 floating point |
0.0f |
| double |
Real number |
64 bit IEEE 754 floating point |
0.0d |
Один из способов помню Java примитивных типов данных с помощью этой мнемонический помощь:: С areful, В ушах S houldn't я ngest L Arge F Urry D ОГС.
Экземпляр переменным присваиваются значения по умолчанию; локальные переменные не могут быть присвоены значения по умолчанию.
Список объектов Java являются переменными, которые держат ссылки на объекты. В отличие от Java примитивных типов данных, которые хранят фактические данные, ссылки на объекты хранить только ссылки на фактические данные объекта.
|
|
Мы используем наблюдатель / Наблюдаемые механизма обнаружения, если файл данных были Modifed поскольку в последний раз.
Мы используем те же файлы данных и DataFileTableModel как предыдущие инструкции. Некоторые незначительные изменения, которые необходимы для DataFileTable класс. Этот класс сейчас реализует интерфейс наблюдателя (см. Update () метод, который будет вызываться при наблюдаемом объекте отправить уведомление).
[DataFileTable.java]
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.io.*;
import java.util.*;
public class DataFileTable extends JPanel
implements Observer {
protected JTable table;
protected DataFileTableModel model;
public DataFileTable(String dataFilePath) {
DataFileWatchdog wd;
Font f;
f = new Font("SanSerif",Font.PLAIN,24);
setFont(f);
setLayout(new BorderLayout());
model = new DataFileTableModel(dataFilePath);
table = new JTable();
table.setModel(model);
table.createDefaultColumnsFromModel();
JScrollPane scrollpane = new JScrollPane(table);
add(scrollpane);
// this watchdog (an Observable object)
// is monitoring any file change
wd = new DataFileWatchdog(dataFilePath);
wd.addObserver(this);
}
public void update(Observable o, Object arg) {
// reload data because data file have changed
model.initVectors();
table.repaint();
}
public Dimension getPreferredSize(){
return new Dimension(400, 300);
}
public static void main(String s[]) {
JFrame frame = new JFrame("Data File Table");
DataFileTable panel;
panel = new DataFileTable("customers.dat");
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setForeground(Color.black);
frame.setBackground(Color.lightGray);
frame.getContentPane().add(panel,"Center");
frame.setSize(panel.getPreferredSize());
frame.setVisible(true);
frame.addWindowListener(new WindowCloser());
}
}
class WindowCloser extends WindowAdapter {
public void windowClosing(WindowEvent e) {
Window win = e.getWindow();
win.setVisible(false);
System.exit(0);
}
}
|
DataFileWatchdog, наблюдаемый объект, проста. Мы используем Свинг таймер, чтобы проверить каждую секунду, если заданный файл изменились. Если метка отличается, то последний, то все зарегистрированные наблюдатели уведомляются об этом.
[DataFileWatchdog.java]
import javax.swing.Timer;
import java.awt.event.*;
import java.io.*;
import java.util.*;
public class DataFileWatchdog extends Observable
implements ActionListener {
Timer t = new Timer(1000,this); // check every second
long lastModified;
String file;
DataFileWatchdog(String s) {
file = s;
File f = new File(file);
lastModified = f.lastModified(); // original timestamp
t.start();
}
public void actionPerformed(ActionEvent e) {
File f = new File(file);
long actualLastModified = f.lastModified() ;
if (lastModified != actualLastModified) {
// the file have changed
lastModified = actualLastModified;
setChanged();
notifyObservers();
}
}
}
|
|
|
Этот совет Java Swing иллюстрирует метод анимации серии изображений, расположенный на месте. Разработчики могут использовать этот совет для создания анимации в их applicationa рисунок с файлами. Эта подсказка может быть использована для анимированных логотипов применения.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LogoAnimator extends JPanel
implements ActionListener {
protected ImageIcon images[];
protected int totalImages = 30,
currentImage = 0,
animationDelay = 50; // 50 millisecond delay
protected Timer animationTimer;
public LogoAnimator()
{
setSize( getPreferredSize() );
images = new ImageIcon[ totalImages ];
for ( int i = 0; i < images.length; ++i )
images[ i ] =
new ImageIcon( "images/java" + i + ".gif" );
startAnimation();
}
public void paintComponent( Graphics g )
{
super.paintComponent( g );
if ( images[ currentImage ].getImageLoadStatus() ==
MediaTracker.COMPLETE ) {
images[ currentImage ].paintIcon( this, g, 0, 0 );
currentImage = ( currentImage + 1 ) % totalImages;
}
}
public void actionPerformed( ActionEvent e )
{
repaint();
}
public void startAnimation()
{
if ( animationTimer == null ) {
currentImage = 0;
animationTimer = new Timer( animationDelay, this );
animationTimer.start();
}
else // continue from last image displayed
if ( ! animationTimer.isRunning() )
animationTimer.restart();
}
public void stopAnimation()
{
animationTimer.stop();
}
public Dimension getMinimumSize()
{
return getPreferredSize();
}
public Dimension getPreferredSize()
{
return new Dimension( 160, 80 );
}
public static void main( String args[] )
{
LogoAnimator anim = new LogoAnimator();
JFrame app = new JFrame( "Animator test" );
app.getContentPane().add( anim, BorderLayout.CENTER );
app.addWindowListener(
new WindowAdapter() {
public void windowClosing( WindowEvent e )
{
System.exit( 0 );
}
}
);
// The constants 10 and 30 are used below to size the
// window 10 pixels wider than the animation and
// 30 pixels taller than the animation.
app.setSize( anim.getPreferredSize().width + 10,
anim.getPreferredSize().height + 30 );
}
}
|
|
|
Вы можете использовать следующий код, чтобы обрезать subimage из образа.
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
public class Cropping extends JPanel
{
BufferedImage image;
Dimension size;
Rectangle clip;
boolean showClip;
public Cropping(BufferedImage image)
{
this.image = image;
size = new Dimension(image.getWidth(), image.getHeight());
showClip = false;
}
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int x = (getWidth() - size.width)/2;
int y = (getHeight() - size.height)/2;
g2.drawImage(image, x, y, this);
if(showClip)
{
if(clip == null)
createClip();
g2.setPaint(Color.red);
g2.draw(clip);
}
}
public void setClip(int x, int y)
{
// keep clip within raster
int x0 = (getWidth() - size.width)/2;
int y0 = (getHeight() - size.height)/2;
if(x < x0 || x + clip.width > x0 + size.width ||
y < y0 || y + clip.height > y0 + size.height)
return;
clip.setLocation(x, y);
repaint();
}
public Dimension getPreferredSize()
{
return size;
}
private void createClip()
{
clip = new Rectangle(140, 140);
clip.x = (getWidth() - clip.width)/2;
clip.y = (getHeight() - clip.height)/2;
}
private void clipImage()
{
BufferedImage clipped = null;
try
{
int w = clip.width;
int h = clip.height;
int x0 = (getWidth() - size.width)/2;
int y0 = (getHeight() - size.height)/2;
int x = clip.x - x0;
int y = clip.y - y0;
clipped = image.getSubimage(x, y, w, h);
}
catch(RasterFormatException rfe)
{
System.out.println("raster format error: " + rfe.getMessage());
return;
}
JLabel label = new JLabel(new ImageIcon(clipped));
JOptionPane.showMessageDialog(this, label, "clipped image",
JOptionPane.PLAIN_MESSAGE);
}
private JPanel getUIPanel()
{
final JCheckBox clipBox = new JCheckBox("show clip", showClip);
clipBox.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
showClip = clipBox.isSelected();
repaint();
}
});
JButton clip = new JButton("clip image");
clip.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
clipImage();
}
});
JPanel panel = new JPanel();
panel.add(clipBox);
panel.add(clip);
return panel;
}
public static void main(String[] args) throws IOException
{
File file = new File("images/cougar.jpg");
Cropping test = new Cropping(ImageIO.read(file));
ClipMover mover = new ClipMover(test);
test.addMouseListener(mover);
test.addMouseMotionListener(mover);
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(test));
f.getContentPane().add(test.getUIPanel(), "South");
f.setSize(400,400);
f.setLocation(200,200);
f.setVisible(true);
}
}
class ClipMover extends MouseInputAdapter
{
Cropping cropping;
Point offset;
boolean dragging;
public ClipMover(Cropping c)
{
cropping = c;
offset = new Point();
dragging = false;
}
public void mousePressed(MouseEvent e)
{
Point p = e.getPoint();
if(cropping.clip.contains(p))
{
offset.x = p.x - cropping.clip.x;
offset.y = p.y - cropping.clip.y;
dragging = true;
}
}
public void mouseReleased(MouseEvent e)
{
dragging = false;
}
public void mouseDragged(MouseEvent e)
{
if(dragging)
{
int x = e.getX() - offset.x;
int y = e.getY() - offset.y;
cropping.setClip(x, y);
}
}
}
|
|
|
Вы можете использовать folowing фрагмент кода для запуска сценариев Unix с Java.
String[] cmd = {"/bin/sh", "-c", "ls > hello"};
Runtime.getRuntime().exec(cmd);
|
|
|
Когда генерируется исключение, исполнение в методе занимает довольно резкое, нелинейные пути, который изменяет нормальный поток через метод. В зависимости от того, как кодируется метод, метод может вернуть досрочно. Например, если метод открывает соединение с базой данных о въезде и закрывает его при выходе из него, тогда вы не хотите, чтобы код, который закрывает файл, который будет обойти, за исключением механизма обработки ключевых слов, наконец, предназначен для решения таких непредвиденных обстоятельств.
"Наконец" создает блок кода, который будет выполнен после Try / Catch блока завершена и перед кодом после Try / Catch блока. И наконец блок будет выполнять или не генерируется исключение.
Если бросить исключение, наконец, блок будет выполнить, даже если не поймут заявления соответствующего исключения. Наконец гарантированно выполнить, даже если они брошены без исключения. Наконец блока является идеальной позиции для закрытия таких ресурсов, как дескриптор файла или базы данных, соединения и т.п.
public class FinallyDemo {
static void procA(){
try{
System.out.println("inside procA");
throw new RuntimeException("demo");
}finally{
System.out.println("procA's finally");
}
}
//Return from with in a try block.
static void procB(){
try{
System.out.println("inside procB");
return;
}
finally{
System.out.println("procB's finally");
}
}
//Execute a try block normally.
static void procC(){
try{
System.out.println("inside procC");
}
finally{
System.out.println("procC's finally");
}
}
public static void main(String[] args) {
try{
procA();
}catch(Exception e){
System.out.println("Exception caught");
}
procB();
procC();
}
}
|
Вывод на экран:
inside procA
procA's finally
Exception caught
inside procB
procB's finally
inside procC
procC's final
|
|
НЕТ! Удивительно большое число людей, в том числе многие веб-дизайнеры, не понимают разницы между Java и JavaScript. Вкратце его можно сформулировать следующим образом:
Java была разработана Sun Microsystems. Java является полноценным объектно-ориентированный язык программирования. Она может быть использована для создания автономных приложений и апплетов. Апплеты загружаются в виде отдельных файлов на вашем браузере ряд документов HTML, а также предоставить бесконечное множество дополнительных возможностей для веб-сайта вы посетили. Результаты отображаются апплетов может оказаться встроенных в страницу HTML (например, прокрутка сообщения баннер, которая так часто встречается на Java расширение участков), но код Java прибыли в виде отдельного файла.
JavaScript с другой стороны, был разработан Netscape, является меньшим и более простой язык сценариев, который не создает апплет или автономные приложения. В своей наиболее распространенной форме Сегодня, JavaScript находится внутри документы HTML, и может обеспечить уровень интерактивности далеко за рамки обычно плоские страницы HTML - без необходимости в серверных CGI (Common Gateway Interface) программами.
Некоторые серверного программного обеспечения, такими как SuiteSpot Netscape, позволяющая разработчикам веб-приложений написать CGI программ в серверной версии JavaScript. Оба клиентского и серверного JavaScript одни и те же основные языке JavaScript, но каждая сторона сделки с различными объектами. Клиентские объекты преимущественно компоненты веб-страницы HTML (например, формы, надписи, кнопки). На стороне сервера это те объекты, которые облегчают обработку заявок, которые приходят от клиентов, а также подключение к базам данных.
|

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Event;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.awt.geom.Rectangle2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.AbstractAction;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.KeyStroke;
public class SwingPrinter extends JFrame {
public static void main(String[] args) {
new SwingPrinter();
}
private PageFormat mPageFormat;
public SwingPrinter() {
super("SwingPrinter v1.0");
createUI();
PrinterJob pj = PrinterJob.getPrinterJob();
mPageFormat = pj.defaultPage();
setVisible(true);
}
protected void createUI() {
setSize(300, 300);
center();
// Add the menu bar.
JMenuBar mb = new JMenuBar();
JMenu file = new JMenu("File", true);
file.add(new FilePrintAction()).setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK));
file.add(new FilePageSetupAction()).setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK
| Event.SHIFT_MASK));
file.addSeparator();
file.add(new FileQuitAction()).setAccelerator(
KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK));
mb.add(file);
setJMenuBar(mb);
// Add the contents of the window.
getContentPane().add(new PatchworkComponent());
// Exit the application when the window is closed.
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
protected void center() {
Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
Dimension us = getSize();
int x = (screen.width - us.width) / 2;
int y = (screen.height - us.height) / 2;
setLocation(x, y);
}
public class FilePrintAction extends AbstractAction {
public FilePrintAction() {
super("Print");
}
public void actionPerformed(ActionEvent ae) {
PrinterJob pj = PrinterJob.getPrinterJob();
ComponentPrintable cp = new ComponentPrintable(getContentPane());
pj.setPrintable(cp, mPageFormat);
if (pj.printDialog()) {
try {
pj.print();
} catch (PrinterException e) {
System.out.println(e);
}
}
}
}
public class FilePageSetupAction extends AbstractAction {
public FilePageSetupAction() {
super("Page setup...");
}
public void actionPerformed(ActionEvent ae) {
PrinterJob pj = PrinterJob.getPrinterJob();
mPageFormat = pj.pageDialog(mPageFormat);
}
}
public class FileQuitAction extends AbstractAction {
public FileQuitAction() {
super("Quit");
}
public void actionPerformed(ActionEvent ae) {
System.exit(0);
}
}
}
class PatchworkComponent extends JComponent implements Printable {
private float mSide = 36;
private float mOffset = 36;
private int mColumns = 8;
private int mRows = 4;
private String mString = "Java Source and Support";
private Font mFont = new Font("Serif", Font.PLAIN, 64);
private Paint mHorizontalGradient, mVerticalGradient;
public PatchworkComponent() {
float x = mOffset;
float y = mOffset;
float halfSide = mSide / 2;
float x0 = x + halfSide;
float y0 = y;
float x1 = x + halfSide;
float y1 = y + (mRows * mSide);
mVerticalGradient = new GradientPaint(x0, y0, Color.darkGray, x1, y1,
Color.lightGray, true);
x0 = x;
y0 = y + halfSide;
x1 = x + (mColumns * mSide);
y1 = y + halfSide;
mHorizontalGradient = new GradientPaint(x0, y0, Color.darkGray, x1, y1,
Color.lightGray, true);
}
public PatchworkComponent(String s) {
this();
mString = s;
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
g2.rotate(Math.PI / 24, mOffset, mOffset);
for (int row = 0; row < mRows; row++) {
for (int column = 0; column < mColumns; column++) {
float x = column * mSide + mOffset;
float y = row * mSide + mOffset;
if (((column + row) % 2) == 0)
g2.setPaint(mVerticalGradient);
else
g2.setPaint(mHorizontalGradient);
Rectangle2D r = new Rectangle2D.Float(x, y, mSide, mSide);
g2.fill(r);
}
}
FontRenderContext frc = g2.getFontRenderContext();
float width = (float) mFont.getStringBounds(mString, frc).getWidth();
LineMetrics lm = mFont.getLineMetrics(mString, frc);
float x = ((mColumns * mSide) - width) / 2 + mOffset;
float y = ((mRows * mSide) + lm.getAscent()) / 2 + mOffset;
g2.setFont(mFont);
g2.setPaint(Color.white);
g2.drawString(mString, x, y);
}
public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
if (pageIndex != 0)
return NO_SUCH_PAGE;
paintComponent(g);
return PAGE_EXISTS;
}
}
class ComponentPrintable implements Printable {
private Component mComponent;
public ComponentPrintable(Component c) {
mComponent = c;
}
public int print(Graphics g, PageFormat pageFormat, int pageIndex) {
if (pageIndex > 0)
return NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D) g;
g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
boolean wasBuffered = disableDoubleBuffering(mComponent);
mComponent.paint(g2);
restoreDoubleBuffering(mComponent, wasBuffered);
return PAGE_EXISTS;
}
private boolean disableDoubleBuffering(Component c) {
if (c instanceof JComponent == false)
return false;
JComponent jc = (JComponent) c;
boolean wasBuffered = jc.isDoubleBuffered();
jc.setDoubleBuffered(false);
return wasBuffered;
}
private void restoreDoubleBuffering(Component c, boolean wasBuffered) {
if (c instanceof JComponent)
((JComponent) c).setDoubleBuffered(wasBuffered);
}
}
|
|
|
Этот совет Java демонстрирует метод рисования основных форм с использованием линий и кривых на компоненты Java. Основными формами может быть сделан разработчиком перезаписи Paint () функцию компонента.
// x, y, controlpointx, controlpointy,controlpointx1, controlpointy1,
// controlpointx2, controlpointy2 may be define by the developer
GeneralPath shape = new GeneralPath();
shape.moveTo(x, y);
shape.lineTo(x, y);
shape.quadTo(controlPointX, controlPointY, x, y);
shape.curveTo(controlPointX1, controlPointY1, controlPointX2,
controlPointY2, x, y);
shape.closePath();
|
|
|
Этот совет Java иллюстрирует метод планирования таймера для задачи запустить повторно. Разработчик может использовать этот код, если есть необходимость выполнить или повторить задачу в заявку на предопределенный отрезок времени.
int delay = 5000; // delay for 5 sec.
int interval = 1000; // iterate every sec.
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
// Task here ...
}
}, delay, interval);
|
|