私は要素プログラムの周期表を作成しようとしています。私はいくつかのクラスとデータベースとしてのJSONファイルを持っています。いくつかの理由で実行可能なjarファイルを使用していますが、アプレットのセキュリティ制限がJSONファイルなどのファイルを読み込むために適用されないため、最大の原因の1つです。Java - スイング - インクリメンタルペイントが動作するように見えない(実行可能なJARファイルを介して実行)
周期表の画像は部分的に静的になります。現在の計画はそれを描画し、2次元配列とカーソルの位置を使用して他のアクションを決定することです。 (このようなアクションには、要素に関する追加情報を表示するポップアップメニューが含まれています)
問題:私の考えでは、動作するはずですが、要素ブロックの1つだけが最後に表示されているはずです。 (それは訂正されても描かれていません...その小さな部分は、おそらく私が後で見つけることができるいくつかのマイナーなバグでしょう)
は私のソースファイルであることを投稿されています(
はJsonObjectはJsonArrayを保持しているのElem: (メインソースファイル)
package PeriodicTable;
class PeriodicTable {
public static void main (String[] args) {
Table table = new Table();
}
}
私の全体的なJSONの構造は以下の通りですエント)
要素118 JsonObjects(要素ごとに1つのオブジェクト)
JsonObjectsを保持しているが、基本的に、それらの対応する要素
(今のように、画面上に示されていないすべて)
するための情報を保持しますpackage PeriodicTable;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.json.JsonArray;
import javax.json.JsonObject;
import java.awt.Toolkit;
import java.awt.Dimension;
import java.io.IOException;
class Table {
private JFrame frmMain;
private Element[][] aryElements;
Dimension dmsScreenSize;
int intScreenHeight, intScreenWidth;
DataBaseReader dbReader;
private int intElementsColumns = 18, intElementsRows = 9;//18 columns in the periodic table, 7 rows + the 2 F block rows, 6 and 7. Totals 9 rows
public Table(){
dmsScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
intScreenWidth = (int)dmsScreenSize.getWidth();
intScreenHeight = (int)dmsScreenSize.getHeight();
frmMain = new JFrame("Periodic Table of the Elements");
frmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmMain.setMinimumSize(dmsScreenSize);
dbReader = new DataBaseReader();
layout("Periodic Table");
frmMain.setVisible(true);
}
void layout(String strLayout){ //Creates the specified table, at the time there is only one.
switch(strLayout){
case "Periodic Table":
periodicTable();
break;
}
}
private void periodicTable() {
aryElements = new Element[intElementsRows][intElementsColumns]; //creates a two-dimensional array of the class Element, hold 9 by 18 blocks
try{
JsonArray jAryElements = dbReader.readDataBase(); //obtains the Element array from Elements.JSON
Element clsElement; //Define an element instance, but not create
for(int index = 0; index < jAryElements.size(); index++){ //go through the Element array (called jAryElements), for every json object in this array...
clsElement = new Element(jAryElements.getJsonObject(index));//create an instance of class Element with the current selected JsonObject
frmMain.add(clsElement); /*add that instance to the JFrame frmMain (Element extends JPanel)
*(For below) Store that instance in the 2d array
*storage location is dependant on the element's row and column in the periodic table*/
aryElements[Integer.parseInt(element.getString("row"))-1][Integer.parseInt(element.getString("columnNumber"))-1] = clsElement;
}
}catch(IOException ioe){
ioe.printStackTrace();
}
}
}
package PeriodicTable;
import javax.json.JsonObject;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Font;
class Element extends JPanel {
JsonObject element;
int intX, intY, intWidth, intHeight;
Font aFont, bFont, cFont;
Element(JsonObject elementForeign){
element = elementForeign; //Store the json object from the database here
intWidth = 50; //width of an element
intHeight = 71; //height of an element
intX = 10+(intWidth*(Integer.parseInt(element.getString("columnNumber"))));
/*<10+> add some space to the left of the entire grid of elements
*<intWidth*(<some code>(<some code>("columnNumber")>
* position would be equal to the element width multiplied by it's column. */
intY = 50+(intHeight*(Integer.parseInt(element.getString("row")))); //Same as intX, but vertically
aFont = new Font("TimesRoman", Font.BOLD, 10);//some fonts for text inside each element
bFont = new Font("TimesRoman", Font.PLAIN, 9);
cFont = new Font("TimesRoman", Font.BOLD, 17);
}
public void update(Graphics gr){ //Post to stop the program from clearing the screen
paintComponent(gr);
}
public void paintComponent(Graphics gr){/*painting method. I've read someone describing the activation
*of this method to occur "magically" when ever something happens to the container
*such as resizing the main window.*/
gr.setColor(getColor("")); //The specifics for every piece of information to be drawn inside a element block
gr.drawRect(intX, intY, intWidth, intHeight);
gr.setColor(getColor(element.getString("group")));
gr.fillRect(intX+1, intY+1, intWidth-2, intHeight-2);
gr.setColor(getColor(""));
gr.setFont(aFont);
gr.drawString(element.getString("atomicNumber"), intX+4, intY+10);
gr.drawString(element.getString("molarMass"), intX+4, intY+29);
gr.setFont(bFont);
gr.drawString(element.getString("electronegativity"), intX+4, intY+20);
gr.drawString(element.getString("ionCharge1"), intX+4, intY+29);
gr.drawString(element.getString("ionCharge2"), intX+4, intY+38);
gr.drawString(element.getString("name"), intX+(intWidth/2)-((gr.getFontMetrics().stringWidth(element.getString("name")))/2), intY+56);
gr.setColor(getColor(element.getString("naturalState")));
gr.setFont(cFont);
gr.drawString(element.getString("symbol"), intX+((intWidth/2)-((gr.getFontMetrics().stringWidth(element.getString("symbol")))/2)), intY+45);
gr.setColor(getColor(element.getString("synthetic")));
gr.drawRect(intX+(intWidth-(2*(intWidth/5)))-1, intY+1, intWidth/5, intWidth/5);
gr.fillRect(intX+(intWidth-(2*(intWidth/5)))-1, intY+2, intWidth/5, intWidth/5);
gr.setColor(getColor(element.getString("diatomic")));
gr.drawRect(intX+(intWidth-(intWidth/5))-1, intY+1, intWidth/5, intWidth/5);
gr.fillRect(intX+(intWidth-(intWidth/5))-1, intY+2, intWidth/5, intWidth/5);
}
private Color getColor(String strType){ //Returns a color depending on the situation (the string that is passed in)
switch(strType){
case "Hydrogen":
return new Color(255,229,204);
case "Alkali Metal":
return new Color(255,102,102);
case "Alkali Earth Metal":
return new Color(255,204,204);
case "Transition Metal":
return new Color(153,255,153);
case "Inner-Transition Metal":
return new Color(0,255,0);
case "Metalloid":
return new Color(255,0,255);
case "Post-Transition Metal":
return new Color(255, 153,51);
case "Halogen":
return new Color(255,128,0);
case "Noble Gas":
return new Color(204,229,255);
case "Unknown-Post-Transition Metal":
case "Unknown-Halogen":
case "Unknown-Noble Gas":
case "false":
return new Color(255,255,255);
case "true":
return new Color(255,255,0);
case "Gas":
return new Color(255,0,0);
case "Liquid":
return new Color(0,0,255);
case "Solid":
default:
return new Color(0,0,0);
}
}
}
(現在、すべてのグラフィックスの横の取り扱い)
私はどのバージョン/プログラム/などを使用していますか?
メモ帳
がコマンドプロンプト
のJava 8
javax.json-1.0.jar
細かい-jarプログラム意志のjavac、jarファイルおよびJava、データベースが細かい読み込み、I情報を使用することができます。そのため、私はそれらについての追加情報は含まない(誰かが尋ねない限り)。
これまではレイアウトなどを使ってみましたが、面倒なことがありました...最終的には、2次元アレイを使用して情報を保持することを考えていました。
私には、多くのサイトを検索した:
http://www.oracle.com/technetwork/java/painting-140037.html
http://www.slideshare.net/martyhall/java-7-programming-tutorial-multithreaded-graphics-and-animation
Java clears screen when calling paint method - how to avoid that?
その他多数私が理解できなかったことのいくつかは、私はかなりの量を学んだ。
私はまだJavaの方が新しいので、私の実際の教育は高校のオンラインコンピュータサイエンスコースの終わりまでです。この余分なプロジェクトに取り組んでいるうちに、私はコースの外で多くのことを学びました。明らかに私の質問に状態に
...インクリメンタル絵が動作していない理由として
任意の手掛かり?どうすればこの問題を解決できますか?
私はあなたが提案してきたものに、さらに見てみましょう。それは時間がかかるだろうが。 – Tyler
@タイラー:いいです。また、周期表には空の要素のスポットがあり、その場合、JPanelを使用してGridLayoutに空白のJLabelを追加します。 –
@タイラー:問題の分析が間違っていることにも注意してください。主に「paintComponent」の問題ではありません。あなたのpaintComponentやその他のペイントメソッドには問題がありますが、主な問題は単純にレイアウトの問題でした。 –