• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:JFileChooserで選択したファイルをテーブルに追加したい)

JFileChooserで選択したファイルをテーブルに追加する方法

このQ&Aのポイント
  • 現在未完成ですが、このような感じでボタンを押してJFileChooserを開いて選択したものをテーブルに格納するものを作ろうとしています。
  • テーブルに格納するのは、String columnName[] = { "名前","サイズ","更新日時","拡張子" };でそれぞれの項目に該当する内容をテーブルの各セルに出力したいです。
  • AbstractTableModelを使ってこのコードにさらに拡張しちゃんとしたものにしたいのですが、どこにどのようなコードを追加していったらよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • davosuke
  • ベストアンサー率61% (34/55)
回答No.1

まず最初にAbstractTableModel抽象クラスなのでテーブルをモデリングするAbstractTableModelを継承したクラスをクラスが必要です。 TestTableModelクラスのソース内容 /** * 表示用データ定義クラス。 */ public class TestTableModel  extends AbstractTableModel { /** * 表示データを保持する。 */ private java.util.List list = new ArrayList(); /** * 行数を保持する。 */ private int rowCount = 0; /** * 列数を保持する。 */ private int colCount = 0; /** * クラスを初期化する。 */ public TestTableModel() { } /** * 表示列数を取得する。 * @return 値 */ public int getColumnCount() { return colCount; } /** * 表示行数を取得する。 * @return 値 */ public int getRowCount() { return rowCount; } /** * 表示する値を取得する。 * @param row 行 * @param col 列 * @return 値 */ public Object getValueAt(int row, int col) { // 行データ取得 java.util.List cl = (java.util.List)list.get(row); // データに無いセルの場合 if(cl.size() <= col) return null; // セルデータ取得 Object obj = cl.get(col); return obj; } } クラス作成には上記くらいの記述が必要かと思われます。尚、私は、テーブルのデータを保持する為Listクラスを使用しました。 (テーブルのデータを保持する為クラスは便宜を図ってください。) jTableを誰がnewするか質問に記述されてないので分かりませんが、生成個所で /** * データモデルを保持する。 */ TestTableModel model = new DataModel(); /** * テーブルを保持する。 */ JTable jTable1 = new JTable(model); としてください。 最後にテーブルの各セルに出力の仕方は (質問引用) private JButton getJButton() {    : jButton.addActionListener(new java.awt.event.ActionListener() {  public void actionPerformed   (java.awt.event.ActionEvent e) { JFileChooser fileChooser = new JFileChooser("."); int state = fileChooser.showOpenDialog(null); File file = fileChooser.getSelectedFile(); if(state != JFileChooser.APPROVE_OPTION ||   file == null){    return;   } } //追加 Start JTable objTable = getJTable(); TestTableModel model = (TestTableModel)objTable.getModel(); model.setValueAt(); //追加 End }); } return jButton; } オブジェクトの生成方法や表示の仕方が明記されていませんので、修正個所としてこれくらいかと思います。 以上、よろしく,お願い致します。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • jFrameを使って複数の画面を生成するにはどうすれば良いのでしょうか?

    eclipseのVE機能を使ってjFrameの画面生成を勉強しているのですが、 複数の画面を生成することができません。。 以下のソースで、ボタンが押された時に新しく画面を生成するように しているのですが、なぜか生成できません。エラーもありません。 何が足りなかったのか、悪かったのかを指摘していただけますでしょうか? import javax.swing.JPanel; import javax.swing.JFrame; import java.awt.GridBagLayout; import javax.swing.JButton; import java.awt.GridBagConstraints; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class jFrameTest extends JFrame implements ActionListener{ private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JButton jButton = null; /** * This is the default constructor */ public jFrameTest() { super(); initialize(); } /** * This method initializes this * * @return void */ private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } /** * This method initializes jContentPane * * @return javax.swing.JPanel */ private JPanel getJContentPane() { if (jContentPane == null) { GridBagConstraints gridBagConstraints = new GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; jContentPane = new JPanel(); jContentPane.setLayout(new GridBagLayout()); jContentPane.add(getJButton(), gridBagConstraints); } return jContentPane; } /** * This method initializes jButton * * @return javax.swing.JButton */ private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setText("jButton"); jButton.addActionListener(this); } return jButton; } //ボタン入力リスナー public void actionPerformed(ActionEvent event) { String cmd = event.getActionCommand(); if(cmd == "jButton"){ jFrameTest jtest = new jFrameTest(); System.out.println("new"); } } }

    • ベストアンサー
    • Java
  • ボーダー上か否かの判定について

    いつもお世話になってます。 またお願いします。 画面上にパネルを配置して パネルに外枠を設定します。 その内部にボタンを2つ配置しました。 この設定した外枠をドラッグ&ドロップすることで パネル(外枠)のサイズを変更し、 外枠以外のパネル部分をドラッグ&ドロップすることで ボタンや外枠含むを含むパネル全体の移動を行いたいのです。 ★のところで枠上か否かを判定させれば良いのでしょうか? それとも他に方法がありますでしょうか? 宜しくお願いいたします。 public class SampleButtonSize extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JPanel jPanel = null; private JButton jButton = null; private JButton jButton1 = null; public Point pMus; private JPanel getJPanel() { if (jPanel == null) { jPanel = new JPanel(); jPanel.setLayout(null); jPanel.setBounds(new Rectangle(30, 25, 205, 98)); jPanel.setBorder(new TitledBorder( new EtchedBorder(), "Power" )); jPanel.add(getJButton(), null); jPanel.add(getJButton1(), null); jPanel.addMouseMotionListener(new java.awt.event.MouseMotionListener() { public void mouseDragged(java.awt.event.MouseEvent e) { if( ★ ) { // 枠 pMus = jPanel.getLocation(); jPanel.setLocation(pMus.x + e.getX(), pMus.y + e.getY() ); } else { // 枠以外 jPanel.setSize(e.getX(), e.getY() ); } } public void mouseMoved(java.awt.event.MouseEvent e) { } }); } return jPanel; } private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setBounds(new Rectangle(16, 25, 82, 58)); } return jButton; } private JButton getJButton1() { if (jButton1 == null) { jButton1 = new JButton(); jButton1.setBounds(new Rectangle(115, 24, 77, 59)); } return jButton1; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { SampleButtonSize thisClass = new SampleButtonSize(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); } public SampleButtonSize() { super(); initialize(); } private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.add(getJPanel(), null); } return jContentPane; } }

    • ベストアンサー
    • Java
  • マウスイベントに合わせた動作を行いたい。

    いつもお世話になってます。 再びお願いします。 枠上か否かの判別はできるようになったのですが 動作が不安定というか意図し動作にならず困っております。 悩み疲れてよく分からなくなってきました(汗) 枠上だと判定した場合にはボーダーサイズを変更して、 枠の内部と判定した場合にはボーダーを含んだパネルを ドラッグの動きに合わせて移動したいのです。 どなたかどこを直せば良いのか分かりますでしょうか。 宜しくお願いいたします。 public class SampleButtonSize extends JFrame { private static final long serialVersionUID = 1L; private JPanel jContentPane = null; private JPanel jPanel = null; private Border jBdrPower = null; private JButton jButton = null; private JButton jButton1 = null; public Point pMus; private JPanel getJPanel() { if (jPanel == null) { jPanel = new JPanel(); jPanel.setLayout(null); jPanel.setBounds(new Rectangle(30, 25, 205, 98)); jPanel.setBorder(new TitledBorder( new EtchedBorder(), "Power" )); jPanel.add(getJButton(), null); jPanel.add(getJButton1(), null); jPanel.addMouseMotionListener(new java.awt.event.MouseMotionListener() { public void mouseDragged(java.awt.event.MouseEvent e) { MusX = e.getX(); MusY = e.getY(); inner = jBdrPower.getBorderInsets(jPanel); Dimension PnlSize = jPanel.getSize(); pMus = jPanel.getLocation(); if( MusX< inner.left || MusX> PnlSize.width - inner.right || MusY< inner.top || MusY> PnlSize.height - inner.bottom ) { // border の内側線よりも外:サイズ変更 jPanel.setSize(MusX, MusY); } else { // border の内側線よりも内:移動 jPanel.setLocation( pMus.x + MusX, pMus.y + MusY ); } } public void mouseMoved(java.awt.event.MouseEvent e) { } }); } return jPanel; } private JButton getJButton() { if (jButton == null) { jButton = new JButton(); jButton.setBounds(new Rectangle(16, 25, 82, 58)); } return jButton; } private JButton getJButton1() { if (jButton1 == null) { jButton1 = new JButton(); jButton1.setBounds(new Rectangle(115, 24, 77, 59)); } return jButton1; } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { SampleButtonSize thisClass = new SampleButtonSize(); thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true); } }); } public SampleButtonSize() { super(); initialize(); } private void initialize() { this.setSize(300, 200); this.setContentPane(getJContentPane()); this.setTitle("JFrame"); } private JPanel getJContentPane() { if (jContentPane == null) { jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.add(getJPanel(), null); } return jContentPane; } }

    • ベストアンサー
    • Java
  • Java JFileChooser

    こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させていただきます。 まず、以下のコードをみていただきたいのですが・・・ public class test03 extends JFrame { DrawPanel dp01; test03() { super("filedialog test"); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); dp01 = new DrawPanel(); add( dp01 ); setResizable( false ); setLocation( 170,300 ); pack(); setVisible( true ); } /** * @param args */ public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ new test03(); } } -------------------------------------------------------- class DrawPanel extends JPanel implements ActionListener { JButton btOpen; JButton btSave; DrawPanel() { super(); setLayout( null ); setPreferredSize( new Dimension( 200, 240 )); setBackground( new Color( 220,240, 230 )); btOpen = new JButton( "open"); btSave = new JButton( "save"); btOpen.addActionListener( this ); btSave.addActionListener( this ); add( btOpen ); add( btSave ); btOpen.setBounds( 0,0, 100,40 ); btSave.setBounds( 100,0, 100, 40 ); } public void actionPerformed( ActionEvent ae01 ) { if( ae01.getSource() == btOpen ) { JFileChooser jfc = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "jpg and gif files","jpg","gif"); jfc.setFileFilter( filter ); int retvalue = jfc.showOpenDialog( null ); if( retvalue == JFileChooser.APPROVE_OPTION ) { //System.out.println( "you choosed a file : "); System.out.println( jfc.getCurrentDirectory().getName() ); System.out.println( jfc.getSelectedFile().getName() ); System.out.println( jfc.getSelectedFile().getAbsolutePath()); } } } } DrawPanel クラスの中の FileNameExtensionFilter についてなのですが、 コンストラクタの引数をこのように指定すると、 jpg と gif のファイルが同時にフィルターされ抽出されるのですが、 Windows7 に標準で付属しているペイントだと、 拡張子一種類ずつのファイルがフィルターにより抽出されます。 JFileChooser を用いても、ペイントのようなファイルの フィルタリングはできるものでしょうか? ご存知のかた、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Java
  • JavaでJTableの行の追加方法について

    今、Javaの勉強をEclopse3.2で勉強している者ですが、 JTableにてEnterを押したら次の行が追加されるという、 プログラムを作りたいのですが、どうしたら良いでしょうか? 自分はaddRow()を使ってみたのですが、うまく動きませんでした。 何が動かない原因なのかわかりません。 わかる人よろしくお願いします。 他のやり方も教えてください。 private JTable getJTable2() { int po =1; if (jTable == null) { model = new DefaultTableModel(po,2); jTable = new JTable(model); jTable.addKeyListener(new java.awt.event.KeyAdapter() { private int po; public void keyPressed(java.awt.event.KeyEvent e) { System.out.println("keyPressed()"); // TODO Auto-generated Event stub keyPressed() public addRow() String[] data = { "A5", "B5" }; jTable.addRow(data); System.out.println("po="+this.po); po += 1; System.out.println("po="+po); jTable.setValueAt("aikai",po,1); return; } });

    • ベストアンサー
    • Java
  • 一つにまとめたい

    最近JAVAプログラミングをやりはじめました。 netbeansで作成しています。 文章を入力し、ドラッグしてもらい格納ボタンを押すと下に表示されます。 ドラッグした文字でいいならOKボタンを押します。 押すと配列に格納されます。 表示を押すと配列の中身が見えます(これは少し適当な作りですが) 今の段階ではこれでうまくいきます。ですがどの配列に入れるか選択したい場合に困っています。 「配列2に格納」というボタンを作った場合、配列2に格納するようにするにはどうすればよいでしょうか? 今の段階では「配列に格納」というボタンは実際はドラッグした文字しか表示していませんが、本来は複数のボタンを配置してボタンにより動作を変えたいのです。ただ同じものを使いたいのです。わざわざ別のボタンやテキストエリアを作るのは無駄ですし。 ただ色々試してもエラーが出てしまい実行できずにいます。 ソースを載せておきます。お願いします。 package javaapplication5; public class sample11 extends javax.swing.JFrame { int i=0; String word1; String[] test = new String[10]; /** Creates new form sample11 */ public sample11() { initComponents(); } @SuppressWarnings("unchecked") private void initComponents() { word = new javax.swing.JTextField(); jButton1 = new javax.swing.JButton(); SelectWord = new javax.swing.JTextField(); Ok = new javax.swing.JButton(); jLabel1 = new javax.swing.JLabel(); Show = new javax.swing.JButton(); jScrollPane1 = new javax.swing.JScrollPane(); ShowResult = new javax.swing.JTextArea(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); word.setText("文章を入力"); jButton1.setText("配列に格納"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); Ok.setText("OK"); Ok.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { OkActionPerformed(evt); } }); jLabel1.setText("で構いませんか?"); Show.setText("表示"); Show.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { ShowActionPerformed(evt); } }); ShowResult.setColumns(20); ShowResult.setRows(5); jScrollPane1.setViewportView(ShowResult); (文字数の都合でここにあったレイアウトに関する記述は削除しました) private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed word1 = word.getSelectedText(); SelectWord.setText(word1); } private void OkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_OkActionPerformed test[i] = SelectWord.getText(); ++i; }//GEN-LAST:event_OkActionPerformed private void ShowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_ShowActionPerformed for(int j=0;j<i;j++){ ShowResult.setText(ShowResult.getText()+test[j]+"\n"); } } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new sample11().setVisible(true); } }); } private javax.swing.JButton Ok; private javax.swing.JTextField SelectWord; private javax.swing.JButton Show; private javax.swing.JTextArea ShowResult; private javax.swing.JButton jButton1; private javax.swing.JLabel jLabel1; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JTextField word; // End of variables declaration }

    • ベストアンサー
    • Java
  • JTableでスクロールバーが表示されない

    JTableで表を作成しました。 表示はされているのですが、 スクロールバーが表示されません。 コードは下記の通りです。 どうか宜しくお願いいたします。 ■Java import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; public class ren32 extends JApplet{ Container c; public void init(){ c = this.getContentPane(); c.setLayout(null); String[] cname = { "name","comment","test1","test2", "(0)","(1)","(2)","(3)","(4)", }; Object[][] cell = { {"","","","","","","","",""}, }; JTable table = new JTable(cell, cname); JScrollPane sp = new JScrollPane(table); sp.setBounds(10,10,750,380); c.add(sp); } } ■html <html> <head> <title>Ren1</title> <body bgcolor=white text=black> <applet code="ren32.class" width="800" height="500"> </applet> </head> </html>

    • ベストアンサー
    • Java
  • ボタンがマウスオーバーしないと表示されない

    java初心者です。 やりたいことは、 i_step変数によって、表示する、画像や、パネル(ボタンが作成されています)を替えたいのです。 今はB_Nextボタンによってi_step変数が加算されます。 i_step=1になると、画像が表示されるのですが、 一緒に表示されてほしい【ボタン1】が表示されません。 ですが、マウスアップすると、表示されるようになります。 はじめは【NEXT】ボタンも表示されなかったのですが、 過去の質問を検索し、 http://oshiete1.goo.ne.jp/qa2530138.html を参照して、super.paint(g);を追加したら、 【NEXT】ボタンは表示されるようになりました。 ソースは以下です。 package guidance_ap; import java.awt.*; import javax.swing.*; public class Test extends JApplet { Image img1, img2; private JButton B_Next = null; private JPanel jContentPane = null; private JPanel jPanel1 = null; private JButton b1 = null; int i_step = 0; public Test() { super(); } public void init() { this.setSize(640, 480); this.setContentPane(getJContentPane()); img1 = getImage(getCodeBase(), "test.gif"); img2 = getImage(getCodeBase(), "test2.gif"); } public void paint(Graphics g) { super.paint(g); jContentPane.removeAll(); jContentPane.add(getB_Next(), null); switch (i_step) { case 0: g.drawImage(img1, 0, 0, this); break; case 1: g.drawImage(img2, 0, 0, this); jContentPane.add(getJPanel1(), null); break; } } private JPanel getJContentPane() { if (jContentPane == null) { try { jContentPane = new JPanel(); jContentPane.setLayout(null); jContentPane.setOpaque(false); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return jContentPane; } private JButton getB_Next() { if (B_Next == null) { try { B_Next = new JButton(); B_Next.setText("NEXT"); B_Next.setLocation(new Point(559, 0)); B_Next.setSize(new Dimension(80, 40)); B_Next.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { i_step++; repaint(); } }); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return B_Next; } private JPanel getJPanel1() { if (jPanel1 == null) { try { jPanel1 = new JPanel(); jPanel1.setOpaque(false); jPanel1.setLayout(null); jPanel1.setSize(new Dimension(640, 480)); jPanel1.setLocation(new Point(0, 0)); jPanel1.setPreferredSize(null); jPanel1.add(getb1(), null); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return jPanel1; } private JButton getb1() { if (b1 == null) { try { b1 = new JButton(); b1.setSize(new Dimension(190, 40)); b1.setText("ボタン1"); b1.setLocation(new Point(90, 400)); b1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed( java.awt.event.ActionEvent e) { } }); } catch (java.lang.Throwable e) { e.printStackTrace(); } } return b1; } } ちなみに【ボタン1】は画像と重なる位置にあります。 super.paint(g);を paintの最後に記述すると、ボタンは表示されますが、 画像が一瞬でて消えてしまいます。 何がいけないのでしょうか?

    • ベストアンサー
    • Java
  • javaで2パネルにテーブルデーターを表示

    今日は! javaの初心者で、初心者なりに、フレームに2個のパネルを作成し、各パネルに同じ テーブルデーターを表示するコードを作ってみましたが、旨く行きません。 下記の添付コードで、不具合点の改造箇所をお教え頂けますと大変助かります。 //================================== package packageA; import java.awt.BorderLayout; import java.awt.Dimension; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; public class JTableTest2 extends JFrame{ public static void main(String[] args){ JTableTest2 test = new JTableTest2("JTableTest2"); test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); test.setVisible(true); } JTableTest2(String name){ setBounds( 0, 0, 300*2, 140*2); setTitle(name); String data[][] = { //テーブルデータを作る {"田辺太郎","89","79","100","100"}, {"山田大助","68","55","72","100"}, {"佐藤恵美","78","69","81","100"} }; //列名の配列 String title[] = {"名前","数学","英語","国語","音楽"}; JTable table = new JTable(data,title); //テーブルデータと列名でテーブルを作る JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); JScrollPane sp = new JScrollPane(table); sp.setPreferredSize(new Dimension(250, 80)); p1.add(sp); //JPanelにJScrollPaneを結合する p2.add(sp); //JPanelにJScrollPaneを結合する getContentPane().add(p1, BorderLayout.WEST); getContentPane().add(p2, BorderLayout.EAST); } } 以上、宜しくお願いします。

    • ベストアンサー
    • Java
  • javaで起こったバグ?!

    私が普段プログラムを書いてコンパイルすると、ほぼ確実といってもいいくらいにおかしなことが起きます。 ボタンを配置して、処理を書きます(ここではJTableが現れるという処理にします)、そしてコンパイルします、コンパイルは通ります、ウィンドウが現れます、ボタンを押したら処理が起きてJTableが現れるはずなのですが、ボタンを押すとコマンドプロンプトでわけわからん英語や数字が現れます(出力される)。 自分の書いたプログラムをeclipseでコピペしても、問題はありませんでした。 コマンドプロンプトを一度消して、直ったプログラムもあります。また、その逆に何度やっても直らないものもあります。 ↓私の書いたプログラムです。おかしいところ等がありましたらご指摘下さい。また解答者様のPCでコピペして、試してみて下さい。 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class Sukejuru extends JFrame implements ActionListener { JPanel p; public static void main(String args[]) { Sukejuru ske = new Sukejuru(); ske.setBounds(200,200,600,300); //大きさ&ウィンドウの位置 ske.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//クローズ ske.setVisible(true); } Sukejuru() { super("Myスケジュール"); JPanel p = new JPanel(); p.setBackground(Color.green); add(p); JButton b1 = new JButton("一月"); b1.addActionListener(this); b1.setActionCommand("b1"); p.add(b1); JButton b2 = new JButton("二月"); b2.addActionListener(this); b2.setActionCommand("b2"); p.add(b2); JButton b3 = new JButton("三月"); b3.addActionListener(this); b3.setActionCommand("b3"); p.add(b3); } public void actionPerformed(ActionEvent e) { JTable table = new JTable(5,5); JScrollPane sp = new JScrollPane(table); p.add(sp); } }

    • ベストアンサー
    • Java