スレッドで表示した画面にタブを表示したいのだが、うまく動かない・・・
受付中
回答 1
投稿
- 評価
- クリップ 0
- VIEW 723
前提・実現したいこと
スレッドを使って画面を表示し、タブを表示したいのですが、うまくいきません。
なぜうごかないのかわかる方教えていただきたいと思い記載しました。
発生している問題・エラーメッセージ
Exception in thread "Thread-3" java.lang.NullPointerException
該当のソースコード
//GamenSeni.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.awt.event.MouseAdapter;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.videoio.VideoCapture;
import org.opencv.imgproc.Imgproc;
public class GamenSeni extends JFrame {
static GamenSeni frame;
JButton button1,button2,button3,button4;
private static final long serialVersionUID = 1L;
private BufferedImage image;
public static void main(String args[]) {
//最初に生成されるフレームの画面の名前
frame = new GamenSeni("GUI_Sample");
//表示させるためにtrueを定義している
frame.setVisible(true);
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
}
public GamenSeni(String title){
super();
setTitle(title);
setBounds(550,250,800,600);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//最初の画面
JPanel p = new JPanel();
p.setBackground(Color.WHITE);
//自分で場所を決めるためのnull
p.setLayout(null);
//設定用の画像を表示させている場所
ImageIcon settei = new ImageIcon("settei.png");
button4 = new JButton("設定",settei);
button4.setBounds(10, 450, 149, 100);
button4.setBackground(Color.WHITE);
button4.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent event){
System.out.print("設定ボタンが押されました"+'\n');
//設定ボタンを押した時の処理
//ボタン1押した時に別のフレームを生成する場所:タイトル(設定画面)
JFrame y = new JFrame();
y.setLayout(null);
y.setTitle("設定画面");
y.setBounds( 300,200,800,600 );
y.setVisible(true);
/*
ボタンやテキストボックスやラベルの名前を決め、生成している場所
*/
button_tukamu1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){
//System.out.print("画面生成ボタンが押されました"+'\n');
JFrame i = new JFrame();
i.setLayout(null);
i.setTitle("画面");
i.setBounds(500, 500, 400, 400);
i.setVisible(true);
}});
}
}
);
button1 = new JButton("スタート");
//ボタンの大きさを決める(x,y)が表示させる場所(w,h)が幅よ高さ
button1.setBounds(10, 10, 100, 100);
//ボタン1クリックしたときのイベント処理
button1.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent event){
//ボタン1押した時に別のフレームを生成する場所:タイトル(ボタン1設定画面)
//スタートボタンを押した時の処理
JFrame f = new JFrame();
f.setLayout(null);
f.setTitle("スタートボタン設定画面");
f.setBounds( 400,200,500,300 );
f.setVisible(true);
JButton button_1 = new JButton("おしてもええんやで");
button_1.setBounds(10,10,100,100 );
f.add(button_1);
button_1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event1){
//おしてもええんやでボタンを押した時の処理
JFrame o = new JFrame();
o.setLayout(null);
o.setTitle("ボタン_1押した時の画面");
o.setBounds(600, 600, 400, 400);
o.setVisible(true);
}});
}
}
);
button2 = new JButton("カメラ");
button2.setBounds(120, 10, 100, 100);
button2.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent event){
//カメラボタンをクリックしたときの処理
upcamera(event);
cameraHenkou(event);
}
}
);
button3 = new JButton("緊急停止");
button3.setBounds(680, 10, 100, 100);
button3.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent event){
//緊急停止ボタンを押した時の処理
JFrame r = new JFrame();
r.setTitle("予備画面");
r.setBounds( 450,500,500,300 );
r.setVisible(true);
}
}
);
p.add(button1);
Container contentPane = getContentPane();
//getContentPane().add(tabbedpane, BorderLayout.CENTER);
//contentPane.add(setei,BorderLayout.CENTER);
getContentPane().add(p, BorderLayout.CENTER);
}
/*カメラを表示させるための設定場所*/
public void upcamera(ActionEvent event){
ThreadTest0 tup0 = new ThreadTest0();
tup0.start();
}
class ThreadTest0 extends Thread{
public void run(){
gui_sirial.camera(1);
}
}
//カメラのしきい値やHSV変更画面の設定
public void cameraHenkou(ActionEvent event){
ThreadTest1 tup1 = new ThreadTest1();
tup1.start();
}
class ThreadTest1 extends Thread{
public void run(){
// cameraHenkou.cameraHenkou(1);
new cameraHenkou();
}
}
}
//cameraHenkou.java
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.awt.event.MouseAdapter;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class cameraHenkou extends JPanel{
JPanel contentPane = new JPanel();
cameraHenkou(){
JTabbedPane tabbedpane;
JTextField indexText;
JFrame frame = new JFrame();
frame.setBounds(500, 500, 500, 500);
frame.setTitle("カメラのしきい値・HSV変更画面");
frame.setVisible(true);
/*JPanel Panel = new JPanel();
Panel.setSize(new Dimension(400,400));
frame.setContentPane(Panel);*/
tabbedpane = new JTabbedPane();
JPanel tabPanel1 = new JPanel();
JPanel tabPanel2 = new JPanel();
tabbedpane.addTab("しきい値", tabPanel1);
tabbedpane.addTab("HSV", tabPanel2);
getContentPane().add(tabbedpane, BorderLayout.CENTER);
//contentPane.add(tabbedpane, BorderLayout.CENTER);
//contentPane.add(Panel, BorderLayout.CENTER);
//contentPane.add(Panel, BorderLayout.PAGE_END);
}
}
試したこと
いろんなサイトを見て、勉強しながら製作しています。
補足情報(FW/ツールのバージョンなど)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
まず、javaではswing+マルチスレッドは推奨されてないはずです。https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/package-summary.html#threading
(バージョンについて特に書かれてなかったので8ですが)
修正を手伝ってもらうとしても、まずソースを分割してください。こんな感じに
public class GamenSeni{}
public class cameraHenkou{}
あとインポート文は*でまとめるなど、もう少し見やすいソースを目指してみてください。
と無駄な話のほうが多かったですが(すいません)スレッドを使わないソースを目指してみてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
umyu
2018/08/31 18:42
Exception in thread "Thread-3" java.lang.NullPointerException以外のエラーメッセージもでていませんか?質問文に追記していただけませんか。
starmineouji
2018/09/02 18:30
スタックトレースといわれる、どこで例外が起きたのか分かる文がないため分かりません。