Hallo Leute,
seit einiger Zeit habe ich ein Problem das ich bisher noch nicht lösen konnte und meine Kenntnisse zur Lösung des Problems mittlerweile an die Grenzen angelangt ist.
Zum Programm: Das Programm soll nach Eingabe der Zutatenanzahl und der Menge durch ein Button das Mischverhältnis berechnen und in ein JPanel mit Hintergrund schreiben. Das Mainpanel besteht aus einem BorderLayout(EAST, CENTER) mit zwei JPaneln. Das CENTER Panel besitzt ein Hintergrundbild. Das EAST Panel beinhaltet die Buttons. Durch druck auf "Mischverhältnis" sollte nun die Anzeige über eine JTextArea im CENTER Panel erfolgen welche aber erst nach zweimaligem drücken erscheint bzw. eig schon auf dem Panel abgebildet ist aber erst durch gedrückter Maustaste und markieren des Textes sichtbar wird. Das Problem sollte auch von anderen Anwendungen hin und wieder bekannt sein denke ich. Zweitens wird auch noch aus "Anomalischen-Gründen" das rechte Panel im CENTER Panel teilsabgebildet was für mich total unverständlich ist. :/ Entferne ich das Bild sieht alles wie erwünscht aus.
Außerdem sollte ich noch erwähnen das meine Strukturierung des Codes evtl. nicht den Erwartungen entsprechen. Bastel mir zum ersten Mal ein eigenes Programm bin für konstruktive Kommentare offen.
Hier der Code ich hoffe es ist nicht zu unübersichtlich:
Ein Bild vom Darstellungsproblem findet sich im Anhang.
seit einiger Zeit habe ich ein Problem das ich bisher noch nicht lösen konnte und meine Kenntnisse zur Lösung des Problems mittlerweile an die Grenzen angelangt ist.
Zum Programm: Das Programm soll nach Eingabe der Zutatenanzahl und der Menge durch ein Button das Mischverhältnis berechnen und in ein JPanel mit Hintergrund schreiben. Das Mainpanel besteht aus einem BorderLayout(EAST, CENTER) mit zwei JPaneln. Das CENTER Panel besitzt ein Hintergrundbild. Das EAST Panel beinhaltet die Buttons. Durch druck auf "Mischverhältnis" sollte nun die Anzeige über eine JTextArea im CENTER Panel erfolgen welche aber erst nach zweimaligem drücken erscheint bzw. eig schon auf dem Panel abgebildet ist aber erst durch gedrückter Maustaste und markieren des Textes sichtbar wird. Das Problem sollte auch von anderen Anwendungen hin und wieder bekannt sein denke ich. Zweitens wird auch noch aus "Anomalischen-Gründen" das rechte Panel im CENTER Panel teilsabgebildet was für mich total unverständlich ist. :/ Entferne ich das Bild sieht alles wie erwünscht aus.
Außerdem sollte ich noch erwähnen das meine Strukturierung des Codes evtl. nicht den Erwartungen entsprechen. Bastel mir zum ersten Mal ein eigenes Programm bin für konstruktive Kommentare offen.
Hier der Code ich hoffe es ist nicht zu unübersichtlich:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.CompoundBorder;
import javax.swing.text.BadLocationException;
public class schnäbbes extends StandardFenster{
/**
*
*/
public static int laenge=0;
public static panelleft left=new panelleft();
public static panelright right=new panelright();
private static final long serialVersionUID = 1L;
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
new schnäbbes();
}
public schnäbbes() throws IOException {
mainpanel main = new mainpanel();
StandardFenster window = new StandardFenster("Schnapsrezepte", main, 600, 500, null);
}
}
class mainpanel extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
mainpanel() throws IOException {
this.setBackground(Color.WHITE);
this.setLayout(new BorderLayout());
this.setBorder(BorderFactory.createTitledBorder("Geben Sie ihr Rezept ein: "));
this.add(new panelright(), BorderLayout.EAST);
schnäbbes.right.setPreferredSize(new Dimension(175, 100));
this.add(new panelleft(), BorderLayout.CENTER);
}
}
class panelright extends JPanel {
/**
*
*/
public static JTextField ml=new JTextField(7);
public static JLabel[] label2=new JLabel[0];
public static JLabel[] label1=new JLabel[0];
public static JTextField name;
public static JTextField beschreibung;
public static JTextField zutaten[]=new JTextField[0];
JTextField feld=new JTextField(7);
private static final long serialVersionUID = 1L;
panelright() {
this.setVisible(true);
CompoundBorder outline = BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.GRAY), BorderFactory.createLineBorder(Color.ORANGE));
this.setBorder(outline);
schnäbbes.right=this;
this.add(new lefttitle());
this.add(new addfeld());
this.add(new laden());
this.add(new Rezepteloeschen());
this.add(new JLabel(" "));
this.add(new JLabel("Eigenschaften: "));
this.add(new berechnemisch());
schnäbbes.right.add(new JLabel(" "));
menge=new JLabel("100");
schnäbbes.right.add(menge);
this.add(new JLabel("ml "));
schnäbbes.right.add(new plus());
schnäbbes.right.add(new minus());
//this.add(zutaten[laenge]);
this.add(new help());
}
class addfeld extends JButton implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
addfeld () {
super("Ansetzen");
this.setBackground(Color.white);
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
Date date=new Date();
DateFormat df=new SimpleDateFormat("dd.MM.yyy");
String ausgabe=df.format(date);
panelright.area.append("\n" + "Angesetzt am: " + ausgabe + ""+"\n");
//schreibt eine Datei
try {
methods.Dateischreiben();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class laden extends JButton implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
laden () {
super("Laden");
this.setBackground(Color.white);
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
area.setText("");
schnäbbes.left.add(area);
try {
methods.Dateilesen();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//schnäbbes.left.validate();
//schnäbbes.left.repaint();
}
}
class Rezepteloeschen extends JButton implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
Rezepteloeschen () {
super(" Rezepte löschen ");
this.setBackground(Color.white);
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
//schreibt eine Datei
try {
PrintWriter pWriter = new PrintWriter(new FileWriter("angesetzt.xml"));
pWriter.println("");
pWriter.flush();
pWriter.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
schnäbbes.left.removeAll();
schnäbbes.left.validate();
schnäbbes.left.repaint();
}
}
class lefttitle extends JPanel{
lefttitle () {
this.add(new JLabel("Zutaten: "));
this.add(feld);
this.add(new JLabel("Menge in ml: "));
this.add(ml);
this.add(new name());
this.add(new beschreibung());
this.add(new zutaten());
this.add(new zutatendelete());
this.setPreferredSize(new Dimension(170, 160));
}
}
class name extends JTextField implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
name () {
super(14);
name=this;
this.setText("Name");
this.addActionListener(this);
//Text delete
this.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent evt) {
name.setText("");
}
});
}
@Override
public void actionPerformed(ActionEvent arg0) {
}
}
class beschreibung extends JTextField implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
beschreibung () {
super(14);
beschreibung=this;
this.setText("Notiz");
this.addActionListener(this);
//Text delete
this.addFocusListener(new FocusAdapter() {
public void focusGained(FocusEvent evt) {
beschreibung.setText("");
}
});
}
@Override
public void actionPerformed(ActionEvent arg0) {
}
}
public static area area = new area();
public static JScrollPane scrollön;
class zutaten extends JButton implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
zutaten () {
super(" create ");
this.setBackground(Color.white);
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
//schnäbbes.left.add(area);
String text=feld.getText();
schnäbbes.laenge= Integer.parseInt(text);
zutaten=new JTextField[schnäbbes.laenge];
label1=new JLabel[schnäbbes.laenge];
label2=new JLabel[schnäbbes.laenge];
for(int i=0; i<zutaten.length;i++) {
int zahl=i+1;
label1[i]=new JLabel("Zutat " + zahl);
schnäbbes.left.add(label1[i]);
zutaten[i]=new JTextField(4);
schnäbbes.left.add(zutaten[i]);
label2[i]=new JLabel("g ");
schnäbbes.left.add(label2[i]);
//zutaten[i].setVisible(true);
}
schnäbbes.left.validate();
schnäbbes.left.repaint();
System.out.println(panelright.zutaten.length + " " + schnäbbes.laenge);
System.out.println(panelright.label1.length + " " + schnäbbes.laenge);
System.out.println(panelright.label2.length + " " + schnäbbes.laenge);
}
}
class zutatendelete extends JButton implements ActionListener{
/**
*
*/
private static final long serialVersionUID = 1L;
zutatendelete () {
super(" clean ");
this.setBackground(Color.white);
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
for(int i=0; i<panelright.zutaten.length; i++) {
schnäbbes.left.removeAll();
panelright.menge.setText("100");
anzahl=100;
}
System.gc();
schnäbbes.left.validate();
schnäbbes.left.repaint();
panelright.area.setText("");
System.out.println(panelright.zutaten.length + " " + schnäbbes.laenge);
System.out.println(panelright.label1.length + " " + schnäbbes.laenge);
System.out.println(panelright.label2.length + " " + schnäbbes.laenge);
}
}
public static JLabel menge;
class berechnemisch extends JButton implements ActionListener {
berechnemisch () {
super(" Mischverhältnis ");
this.setBackground(Color.white);
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
/*scrollön = new JScrollPane(area);
scrollön.setVisible(true);
schnäbbes.left.add(scrollön);*/
schnäbbes.left.add(area);
String text = methods.mischverhaeltnis(zutaten, ml.getText());
panelright.area.append("____________________________________________________" + "\n");
panelright.area.append(name.getText() + "\n");
panelright.area.append(beschreibung.getText() + "\n");
panelright.area.append(text);
panelright.area.append("\n");
System.out.println(methods.mischverhaeltnis(zutaten, ml.getText()));
}
}
public static int anzahl=100;
public static plus plus;
class plus extends JButton implements ActionListener{
plus () {
super("+");
this.setBackground(Color.white);
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
int start=0;
int count=0;
int end=0;
try {
start = panelright.area.getLineStartOffset(5);
count = panelright.area.getLineCount();
end = panelright.area.getLineEndOffset(count-1);
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
panelright.area.replaceRange("", start, end);
panelright.area.append(methods.plus());
anzahl+=100;
String stringzahl=String.valueOf(anzahl);
panelright.menge.setText(stringzahl);
System.out.println(count = panelright.area.getLineCount());
}
}
public static minus minus;
class minus extends JButton implements ActionListener{
minus () {
super("-");
this.setBackground(Color.white);
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
int start=0;
int count=0;
int end=0;
try {
start = panelright.area.getLineStartOffset(5);
count = panelright.area.getLineCount();
end = panelright.area.getLineEndOffset(count-1);
} catch (BadLocationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
panelright.area.replaceRange("", start, end);
panelright.area.append(methods.minus());
if(anzahl>0)anzahl-=100;
String stringzahl=String.valueOf(anzahl);
if(anzahl>=0) panelright.menge.setText(stringzahl);
}
}
}
class panelleft extends JPanel {
/**
*
*/
private static final long serialVersionUID = 1L;
private BufferedImage bi;
public void paint(Graphics g) {
g.drawImage(bi, getWidth()-250,getHeight()-163, 240, 153, Color.BLACK, schnäbbes.left);
g.dispose();
}
panelleft() {
//this.setLayout(new GridLayout(4,4));
this.setBackground(Color.WHITE);
//this.setLayout(new SpringLayout());
//CompoundBorder outline = BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.GRAY,4), BorderFactory.createLineBorder(Color.darkGray,2));
//this.setBorder(outline);
schnäbbes.left=this;
try {
bi=ImageIO.read(new File("teekanneedited.jpg"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class area extends JTextArea {
/**
*
*/
private static final long serialVersionUID = 1L;
area() {
super(4, 33);
//CompoundBorder outline = BorderFactory.createCompoundBorder(BorderFactory.createLineBorder(Color.GRAY), BorderFactory.createLineBorder(Color.darkGray));
//this.setBorder(outline);
this.setEditable(false);
this.setPreferredSize(new Dimension(240, 250));
}
}
class help extends JButton implements ActionListener{
help () {
super("?");
this.setBackground(Color.GRAY);
this.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(null, "1: Geben Sie die Anzahl der Zutaten bei 'Zutaten' ein" + "\n" + "und wählen Sie ihre gewünschte Menge in ml z. B.: 100. Drücken Sie nun Auf 'Create'. \n \n 2: Links erscheint nun die Anzeige zur Eingabe der gewünschten Zutatenmenge in Gramm. \n Beachten Sie hierauf Ihre Eingaben bei Kommazahlen durch ein PUNKT '.' zu trennen. \n \n 3: Anschließend klicken Sie auf Mischverhältnis um die Mischung pro 100ml umzurechnen. \n \n 4: Durch dücken des '+' und '-' Button kann die gewünschte Menge in 100er Schritten noch einmal eingestellt werden. \n Nachdem Sie ihren Ansatz nach belieben erstellt haben können Sie nun auf 'Ansetzen' drücken und \n ihr Rezept wird abgespeichert und mit einem Zeitstempel versehen.", "Hilfe", JOptionPane.QUESTION_MESSAGE);
}
}
Ein Bild vom Darstellungsproblem findet sich im Anhang.