
TextPaneElement1
TextPaneElement2
TextPaneElement3
・
・
・
TextPaneElement○
○は数字で、文字にキャストして宣言したいです。
一つ一つ宣言するのは面倒だし、メモリーを食いそうなので、動的に生成したいです。
最初は1個、テキストボックスが有って、+ボタンで増えて、-ボタンで減らす処理です。
____________________________________________________________________
【実行時エラーメッセージ】java.lang.ClassNotFoundException: PreFrame$InputSupportForm_RandomTag_For_PC$TextPaneElement1
____________________________________________________________________
public class InputSupportForm_RandomTag_For_PC extends Frame implements ActionListener ,KeyListener {
/****/
private static final long serialVersionUID = 1L;
Button btnDecrease = new Button("-");
Button btnIncrease = new Button("+");
public void InsertData(String TargetFormName,int TargetFormSEQNUM,String TargetTextPaneName,int LastCaret, String BOT_DIC) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
//右クリックで呼び出されたカーソル位置を覚えていて、ランダムな項目の設定した分、フォーマットを調整して、LastCaretの位置に挿入する
・・・
}
public JTextPane SetTextPane(int TargetFormSEQNUM,int TargetElementSEQNUM,int LastCaret) throws IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
TeraBotMain MainClass = new TeraBotMain();
String TargetObject = ("PreFrame$InputSupportForm_RandomTag_For_PC$TextPaneElement" + String.valueOf(MainClass.TargetElementSEQNUM));
Class<?> cls;
try {
cls = Class.forName(TargetObject); //【エラー箇所】
JTextPane clsJTextPane = (JTextPane)cls.newInstance();
TargetObject = ("PreFrame$InputSupportForm_RandomTag_For_PC$TextPaneScrollElement" + String.valueOf(MainClass.TargetElementSEQNUM));
Class<?> cls2 = Class.forName(TargetObject);
JScrollPane clsScrollPane = (JScrollPane)cls2.newInstance();
clsScrollPane.setPreferredSize(new Dimension(120, 50));
clsScrollPane.setMinimumSize(new Dimension(120, 50));
clsJTextPane.setBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(""),
BorderFactory.createEmptyBorder(5,5,5,5)));
clsScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);clsScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
if (null != cls) {
JPanel pn5 = new JPanel();
pn5.setLayout(new FlowLayout());
//+を押すとint TargetElementSEQNUMを1増やし、TextPaneを一つ増やす
//-を押すとint TargetElementSEQNUMを1減らし、TextPane内の文字をクリアして、setVisible(false)
pn5.add(clsScrollPane);
//Button btnDecrease = new Button("-");
pn5.add(btnDecrease);
//Button btnIncrease = new Button("+");
pn5.add(btnIncrease);
Container contentPane = InputSupportForm_RandomTag.getContentPane();
InputSupportForm_RandomTag.setVisible(true);
InputSupportForm_RandomTag.add(pn5, BorderLayout.CENTER);
return clsJTextPane;
}
} catch (ClassNotFoundException e1) {
// TODO 自動生成された catch ブロック
e1.printStackTrace();
}
return null;
}
InputSupportForm_RandomTag_For_PC(){
・・・
@Override
public void actionPerformed(ActionEvent e) {
// TODO 自動生成されたメソッド・スタブ
//if (e.getActionCommand()=="+"){
if (e.getSource() == btnIncrease) {
TargetElementSEQNUM++;
}
if (e.getSource() == btnDecrease) {
TargetElementSEQNUM--;
}
SetTextPane(TargetFormSEQNUM,TargetElementSEQNUM,LastCaret)
}
}
____________________________________________________________________
困ってます、どなたかご教授下さい。また、そんな簡潔に記述する事はできない なら、
次善の策をご教授下さい。

No.2ベストアンサー
- 回答日時:
サンプル的に作ってみました。
細かいチェックはしていないのでエラーも発生します。ポイントとしては
・JTextPane だけを束ねる JPanel (下記ではButtonsPanel)を用意して管理する
・コンポーネント追加・削除した場合は revalidate() で再描画する
でしょうか。
----------------------
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.List;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JTextPane;
public class ButtonsDialog extends JDialog {
public static void main(String[] args) throws Throwable {
new ButtonsDialog().setVisible(true);
}
public ButtonsDialog() {
initDialog();
getContentPane().add(new SamplePanel());
}
protected void initDialog() {
setBounds(300, 300, 800, 200);
}
protected class SamplePanel extends JPanel {
private JButton incButton;
private JButton decButton;
private ButtonsPanel panel;
public SamplePanel() {
panel = new ButtonsPanel();
incButton = new JButton("+");
incButton.addActionListener((e) -> {
panel.addTextPane();
this.revalidate();
});
decButton = new JButton("-");
decButton.addActionListener((e) -> {
panel.delTextPane();
this.revalidate();
});
initLayout();
}
protected void initLayout() {
GroupLayout layout = new GroupLayout(this);
setLayout(layout);
// 自動的にコンポーネント間のすき間をあけるようにする
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
// 水平方向のグループ
GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
hGroup.addGroup(layout.createParallelGroup()
.addComponent(incButton).addComponent(decButton).addComponent(panel));
// レイアウト・マネージャに登録
layout.setHorizontalGroup(hGroup);
// 垂直方向のグループ
GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
vGroup.addGroup(layout.createParallelGroup().addComponent(incButton));
vGroup.addGroup(layout.createParallelGroup().addComponent(decButton));
vGroup.addGroup(layout.createParallelGroup().addComponent(panel));
// レイアウト・マネージャに登録
layout.setVerticalGroup(vGroup);
}
}
private static class ButtonsPanel extends JPanel {
private List<JTextPane> textPanes;
public ButtonsPanel() {
this.textPanes = new ArrayList<>();
}
public void addTextPane() {
JTextPane p = createTextPane();
textPanes.add(p);
this.add(p);
}
public void delTextPane() {
JTextPane removedPane = textPanes.remove(textPanes.size() - 1);
this.remove(removedPane);
}
private JTextPane createTextPane() {
JTextPane p = new JTextPane();
p.setPreferredSize(new Dimension(100, 30));
return p;
}
}
}
動的にテキストボックスが生成できただけでも、大助かりなので、有難うございました!リストを使うとは思いつきませんでした。スクロールバーですが、スクロールバーを配置し、自分でテキストボックスの座標を調整したするようにすれば、面倒ですが出来そうです。もっと簡単な方法があれば思って補足しました。サンプルは他にも修正しましたが、文字数の都合上載せられません。もう少ししたら、締め切ろうかと思います。
No.3
- 回答日時:
試してないですが、今回作ったJTextPaneを載せたJPanelに対して、JScrollPane を設定すればスクロールできると思いますよ。
座標位置をズラすなどはやめたほうがよさそうですね。
No.1
- 回答日時:
List<JTextPane> textPaneList = new ArrayList<JTextPane>();
のようにリスト型で保持しておくと動的にインスタンスを追加できますよ。
「+」ボタンが押されたときに
JTextPane p = new JTextPane();
textPaneList.add(p); // 動的に追加
貴重なご回答有難うございます!現在はテキストボックスをフレームに追加して、再描画したいのですが(表示位置を変えたり、再描画の様な命令を書いてみましたが)、うまく行かないのと「+」「-」のボタンを常に一番右(右下)に配置しておきたいので、テキストボックスを全て削除してから、1個ずつ追加できません。画面上は変化なしです。
if (e.getSource() == btnIncrease) {
System.out.println("+ボタン 要素数=" + scrollPaneList.size() + "個");
JTextPane p = new JTextPane();
textPaneList.add(p);
p.setBorder(
BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(""),
BorderFactory.createEmptyBorder(5,5,5,5)));
JScrollPane q = new JScrollPane(p);
scrollPaneList.add(q);
q.setPreferredSize(new Dimension(120, 50));
q.setMinimumSize(同上);
q.setBorder(同上);
q.setVerticalScrollBarPolicy(省略);
JPanel pn5 = new JPanel();
pn5.setLayout(new FlowLayout());
remove(btnDecrease);
remove(btnIncrease);
pn5.add(q);
//for (int i = 0 ; i < scrollPaneList.size() ; i++){
// pn5.add(scrollPaneList.get(i));
//}
pn5.add(btnDecrease);
pn5.add(btnIncrease);
add(pn5, BorderLayout.CENTER);
//repaint();
//pn5.updateUI();
invalidate();
validate();
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TextAreaでの文字の色
-
java junit list同士の比較方法
-
Enterキーでボタンを押すにはど...
-
エラーで式の開始が不正ですと...
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
JavaScriptの変数をjavaのメソ...
-
ORA-01858: 数値を指定する箇所...
-
VBAで配列の計算
-
javaで質問です。 文字列2023/2...
-
JScrollPaneで、表示がおかしく...
-
JavaScriptを使ってロト6の当...
-
streamで送信されたArrayListを...
-
JavaScriptとVBScriptに関して
-
IF関数でEmpty値を設定する方法。
-
動的配列が存在(要素が有る)か...
-
ループ処理の際、最後だけ","を...
-
オブジェクトの中のプロパティ...
-
1~100までの数字を表示したい
-
matchesを否定文として使う方法...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Buttonを押すと画像が表示され...
-
setPrefferedSizeとsetSize
-
javaで文字数制限するには?
-
JPanelの切り替えと再描画
-
java junit list同士の比較方法
-
SwingのJMenuに大量のJMenuItem...
-
JDialogを閉じた時の処理
-
JFrameとJPanelの最大化について
-
KeyListenerの使い方について
-
最後の行に移動するには?
-
JTable の 列幅を個別に設定す...
-
TextAreaでの文字の色
-
cadで作った図面をフレーム上で...
-
JTableの列ヘッダ
-
4択クイズでのランダム出題の...
-
JPanelの重ね方/OverlayLayout他
-
Enterキーでボタンを押すにはど...
-
Swing自作コンポーネントをadd...
-
Java-Swing TextAreaにスクロー...
-
キーボードから入力された全角...
おすすめ情報
【実行時エラー】
GroupLayout can only be used with one Container at a time
【訂正前】
GroupLayout layout = new GroupLayout(this);
setLayout(layout);
【訂正後】
// http://kelvinh.github.io/blog/2010/06/09/swing-g …
GroupLayout layout = new GroupLayout(getContentPane());
getContentPane().setLayout(layout);
有難う御座います!動的に生成する事ができました。しかし画面からはみ出た場合に、スクロールバーはどうやって設定すれば?難しいのなら、参考ページを教えてくれると嬉しいです。
アドバイスありがとうございます。無謀な事をしなくて済みました(^^ゞ 思った通りの画面作れました!(遅くなってスミマセン。参考までにスクリーンショット付けます。)